Играя с универсальными ссылками, я наткнулся на случай, когда 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; кроме Intellisense, который на стороне gcc :-)