7

cppreference.com のこの説明は、

テンプレートで使用される従属名の検索は、テンプレート引数が判明するまで延期されます。その時点で [...] 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 つのコンパイラすべてにバグがあるとは考えにくいです。私は何かを誤解したかもしれません。これについて詳しく説明していただけますか?

4

1 に答える 1