C++ 左值参数是否更喜欢左值引用参数而不是通用引用?
在使用通用引用时,我遇到了这样一个实例,其中clang和gcc在重载解决方案上存在分歧C++ 左值参数是否更喜欢左值引用参数而不是通用引用?,c++,c++11,overload-resolution,universal-reference,forwarding-reference,C++,C++11,Overload Resolution,Universal Reference,Forwarding Reference,在使用通用引用时,我遇到了这样一个实例,其中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 << "vo
#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
}
#包括
结构foo{};
模板
void bar(T&){std::cout“通用参考”将参数推断为foo&
。第一个模板还将参数推断为foo&
C++有一个函数模板的偏序规则,使得T&
比T&
更专业化。因此,必须在示例代码中选择第一个模板。这是。intel(13.0.1)和pgi(13.4)编译器也都会产生一个错误。找到标准参考-来自N3691的§14.8.2.4/9节