Предпочитает ли аргумент lvalue ссылочный параметр lvalue перед универсальной ссылкой?

Играя с универсальными ссылками, я натолкнулся на случай, когда 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 Вызов выше неоднозначен. Тем не мение, лязг выбирает T& перегрузка и успешно компилируется.

Какой компилятор не так и почему?

Редактировать:
Протестировал тот же код в VS2013 Preview, и он согласен с clang; кроме Intellisense, который находится на стороне gcc 🙂

17

Решение

«Универсальная ссылка» выводит параметр в foo&, Первый шаблон также выводит параметр в foo&,

C ++ имеет правило частичного упорядочения для шаблонов функций, которое делает T& быть более специализированным, чем T&&, Следовательно, первый шаблон должен быть выбран в вашем примере кода.

18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]