3

以下のコードは有効な C++98 ですか、それとも新しいバージョンの C++ 標準が必要ですか?

namespace basic
{
  void f(int) {}
}

namespace lib
{
  template<class T1, class T2>
  void g(T1 x1, T2 x2)
  {
    using basic::f; // pull in function f for basic types without ADL
    f(x1);
    f(x2); // error: no suitable conversion function from "user::c" to "int" exists
  }
}

namespace user
{
  class c {};

  void f(c) {}
}

int main()
{
  lib::g(1, user::c());
}

どうやら、私のコンパイラ (EDG フロント エンドに基づいていると思います) は、basic::f の using 宣言の後、user::f を考慮しません。C++98 によると、これは正しい動作ですか?

4

1 に答える 1

2

コンパイラの正しい動作ではないと思います。テンプレートは、使用宣言の時点で実際に解決/インスタンス化する必要があります。したがって、その時点で、そのインスタンス化の名前を解決する必要があり、それらにはルックアップで ADL プルされたものが含まれているため、機能するはずです。

ただし、MSVC にはまだこの 2 フェーズ ルックアップを行うための保留事項があり、コンパイラ (EDG フロントエンド? コンパイラの名前は何ですか) もそれを行う可能性があると思います。MSVC2015 が適切な 2 フェーズ ルックアップを実行しないという事実は知っていますが、それがこの例に当てはまるかどうかはわかりません。つまり、そのコンパイラを使用していないということです。

于 2015-10-08T12:16:10.693 に答える