左值参数是否比通用引用更喜欢左值引用参数?

时间:2013-07-31 19:31:41

标签: 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 << "void bar(T&&)\n"; }

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

gcc reports上面的调用含糊不清。但是,clang会选择T&重载并成功编译。

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

编辑:
在VS2013 Preview上测试了相同的代码,它同意clang;除了Intellisense,它位于gcc的一边: - )

1 个答案:

答案 0 :(得分:18)

“通用参考”将参数推导为foo&。第一个模板还将参数推断为foo&

C ++有一个功能模板的部分排序规则,使T&T&&更专业。因此,必须在示例代码中选择第一个模板。