当lvalue参数和万能引用同时存在时,lvalue参数是否优先选择lvalue引用作为其形参?

17

在玩弄通用引用时,我遇到了这样一个情况: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报告上面的调用是有歧义的。然而,clang选择了 T& 重载并成功编译。

哪个编译器有问题,为什么?

编辑:
在VS2013 Preview上测试了相同的代码,并且与clang一致;除了Intellisense,它站在gcc这边:-)


5
这是 GCC Bug 54425 - Casey
Intel(13.0.1)和PGI(13.4)编译器也会报错。 - Zulan
1个回答

18

“通用引用”会将参数推导为foo&。第一个模板也会将参数推导为foo&

C++对函数模板有部分排序规则,使得T&T&&更为特化。因此,在您的示例代码中必须选择第一个模板。


4
找到了标准参考 - 来自N3691章节§14.8.2.4/9。 - Praetorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接