ユニバーサル リファレンスで遊んでいるときに、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 プレビューで同じコードをテストし、clang に同意します。gcc側にあるIntellisenseを除いて:-)