C++ 左值参数是否更喜欢左值引用参数而不是通用引用?

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

在使用通用引用时,我遇到了这样一个实例,其中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
}
#包括
结构foo{};
模板
void bar(T&){std::cout“通用参考”将参数推断为
foo&
。第一个模板还将参数推断为
foo&


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

这是。intel(13.0.1)和pgi(13.4)编译器也都会产生一个错误。找到标准参考-来自N3691的§14.8.2.4/9节