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 方面:-)

4

1 回答 1

18

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

C++ 对函数模板有一个偏序规则,它T&T&&. 因此,必须在您的示例代码中选择第一个模板。

于 2013-07-31T19:34:03.167 回答