2017-09-20 12 views
1

削除された機能とADL

第1の例:

namespace A 
{ 
    struct S{}; 

    void f(S){cout << "adl" << endl;} 
} 

namespace C 
{ 
    //void f() = delete; 

    //void f (double); 

    void test() 
    { 
     A::S arg; 
     f(arg); 
    } 
} 


int main() 
{ 
    C::test(); 

    return 0; 
} 

予想したように、A::fはADLを介して呼び出されます。次の例では、Cに同じ名前の削除機能があります:

namespace A 
{ 
    struct S{}; 

    void f(S){cout << "adl" << endl;} 
} 

namespace C 
{ 
    void f() = delete; 

    //void f (double); 

    void testi() 
    { 
     A::S arg; 
     f(arg); 
    } 
} 


int main() 
{ 
    C::testi(); 

    return 0; 
} 

コンパイルはエラーメッセージerror: use of deleted function 'void C::f()'で失敗します。明らかに、削除された関数は、ADLバージョンがオーバーロードテーブルに入るのを止めます。今、最後の例のために:これはfのADLバージョンを実行実行

namespace A 
{ 
    struct S{}; 

    void f(S){cout << "adl" << endl;} 
} 

namespace C 
{ 
    void f() = delete; 

    void f (double); 

    void testi() 
    { 
     A::S arg; 
     f(arg); 
    } 
} 


int main() 
{ 
    C::testi(); 

    return 0; 
} 

:削除された機能に加えて、同じ名前を持つ別の、-削除されず、機能が今そこにあります。だから、結論に:

  • ADLバージョンで現在の名前空間の結果はADLバージョンがで発見されていないためか、エラーで現在の名前空間の結果でちょうど削除した機能を持つ
  • と呼ばれている一致する機能を有していませんall
  • 現在の名前空間に別の削除されていない関数があると、ADLのバージョンが呼び出されます。

質問:この動作は意図的なものですか?そうであれば、規格のどの部分がこれを指定していますか?

編集:私はコンパイルにonlinegdbを使用したことを忘れていたので、gcc/g ++が使用されました。

答えて

1

明確なコンパイラのバグ。 C++標準のドラフト(n4659)[dcl.fct.def.delete]/2引用すると:暗黙的または明示的に削除された機能をいう

プログラム、それを宣言する以外 を、悪い形成されています。 [注:これには、暗黙的または明示的に関数 を呼び出して、関数へのポインターまたはそのポインターを作成することが含まれます( )。これは、潜在的に評価されない式の の参照にも適用されます。 機能が にオーバーロードされている場合は、機能が オーバーロードの解像度で選択されている場合にのみ参照されます。仮想関数の暗黙的なodr-useは、それ自身では参照を構成しません。 - 終了ノート]

ADLでオーバーロードを選択できません。したがって、この関数は参照されるべきではありません。 2番目のコードサンプルは整形式のC++プログラムです(欠落しているincludeディレクティブが戻された場合)。あなたがコンパイルする++グラムを使用して言及した


は、この問題は、私はちょうど実現fixed in GCC 7.2.0

+0

であることに注意してG ++ 5.4.1 C++ 14私の例 – LcdDrm

+1

@LcdDrmで使用された - あなたが使用することができます[Wandbox] (https://wandbox.org/)、あなたが望むならば、修正された時を正確に知るためにGCCバージョンによるバイナリ検索を行います:) – StoryTeller

+1

GCC 6.3が失敗し、GCC 7.1が動作します。MS Visual Studioコンパイラも動作します – LcdDrm

関連する問題