C++ 使用声明和参数依赖查找

标签 c++ argument-dependent-lookup using-declaration

下面的代码是有效的 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,这是正确的行为吗?

最佳答案

我认为这不是您的编译器的正确行为。您的模板应该只在声明使用点之后才实际解析/实例化。因此,此时它应该解析该实例化的名称,并且这些名称包括 ADL 拉入查找,所以这应该有效。

我认为 MSVC 仍然有待处理的事情来执行此两阶段查找,并且您的编译器(EDG 前端?编译器的名称是什么)也可能会执行此操作。我确实知道 MSVC2015 没有进行适当的两阶段查找,但我不确定这是否适用于此示例,您的暗示是您没有使用该编译器。

关于C++ 使用声明和参数依赖查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015435/

相关文章:

c++ - 在 C++ 中通过网格/矩阵找到成本优化路径

c++ - 源是通过 add_library 命令 PUBLIC 还是 PRIVATE 添加到库中的?

c++ - 为什么 std::swap 不使用交换习语?

c++ - 调用 ADL 时,表达式和 namespace 之间是否会发生冲突?

c++ - 类模板中声明的友元函数的模板参数推导

c++ - 使用声明和 const 重载

c++ - 为什么move构造函数不通过using声明继承

c++ - 全新安装的子弹物理引擎无法正确链接?

c++ - 什么是 move 语义?

c++ - 在 C++ 中使用指令与使用声明交换