【问题标题】:C++ using declaration and argument dependent lookupC++ 使用声明和参数依赖查找
【发布时间】:2016-01-06 01:18:46
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 编译器名称为Wind River Diab Compiler version 5.5。
  • 不能责怪他们犯了错误,Visual Studio 2015 仍然出错了……尽管像这样大的公司甚至不支持完整的 C++98 都逃脱了,这是一种耻辱 -这不是指现在已弃用的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多