【问题标题】:Does an lvalue argument prefer an lvalue reference parameter over a universal reference?左值参数是否更喜欢左值引用参数而不是通用引用?
【发布时间】:2013-07-31 19:31:40
【问题描述】:

在使用通用引用时,我遇到了这种情况,clang 和 gcc 在重载解析上存在分歧。

#include <iostream>

struct foo {};

template<typename T>
void bar(T&) { std::cout << "void bar(T&)\n"; }

template<typename T>
void bar(T&&) { std::cout << "void bar(T&&)\n"; }

int main()
{
    foo f;
    bar(f);  // ambiguous on gcc, ok on clang
}

gcc reports 上面的调用是模棱两可的。但是clang选择T&amp;重载,编译成功。

哪个编译器出错了,为什么?

编辑:
在VS2013 Preview上测试了同样的代码,和clang一致;除了 Intellisense,它在 gcc 方面 :-)

【问题讨论】:

  • 这是GCC bug 54425
  • intel(13.0.1) 和 pgi(13.4) 编译器也会产生一个错误。

标签: c++ c++11 overload-resolution universal-reference forwarding-reference


【解决方案1】:

“通用引用”将参数推导出为foo&amp;。第一个模板还将参数推导出为foo&amp;

C++ 对函数模板有一个偏序规则,这使得T&amp;T&amp;&amp; 更专业。因此,必须在您的示例代码中选择第一个模板。

【讨论】:

  • 找到标准参考 - 来自 N3691 第 14.8.2.4/9 节
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多