第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 ++が使用されました。
であることに注意してG ++ 5.4.1 C++ 14私の例 – LcdDrm
@LcdDrmで使用された - あなたが使用することができます[Wandbox] (https://wandbox.org/)、あなたが望むならば、修正された時を正確に知るためにGCCバージョンによるバイナリ検索を行います:) – StoryTeller
GCC 6.3が失敗し、GCC 7.1が動作します。MS Visual Studioコンパイラも動作します – LcdDrm