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 仍然有一个未决的事情要做这个两阶段查找,你的编译器(EDG 前端?编译器的名称是什么)也可能这样做。我知道 MSVC2015 没有进行正确的两阶段查找这一事实,但我不确定这是否适用于此示例,并且您的意思是您没有使用该编译器。

于 2015-10-08T12:16:10.693 回答