テンプレートで使用される従属名の検索は、テンプレート引数が判明するまで延期されます。その時点で [...] ADL は、テンプレート定義コンテキストまたはテンプレート インスタンス化コンテキストのいずれかから見える外部リンケージを持つ関数宣言を調べます。
これとは対照的に、次のコード スニペットは 3 つのコンパイラ (MSVC、clang、gcc) で正常にコンパイルされます。
template <class T>
void CallFoo ()
{
Foo (T ());
}
class Apple {};
int main ()
{
CallFoo<Apple> ();
}
static void Foo (Apple)
{
}
Foo
は の従属名ですCallFoo
: テンプレート引数 に依存しますT
. ただし、Foo
上記の引用された規則の 2 つに違反しているにもかかわらず、関数はコンパイラによって検出されます。
- の宣言は
Foo
、 の定義またはインスタンス化のどちらからも見えませんCallFoo
。これは、両方の下にあるためです。 Foo
内部リンケージがあります。
3 つのコンパイラすべてにバグがあるとは考えにくいです。私は何かを誤解したかもしれません。これについて詳しく説明していただけますか?