Рассмотрим ниже приведенный ниже фрагмент:
template <class T>
using identity = T;
template <class T>
void foo(identity<T>&&) {}
int main()
{
int i{};
foo(i);
}
i
является значением lvalue, поэтому если foo
объявляет ссылочный параметр пересылки, он должен скомпилироваться. Однако, если identity<T>&&
оказывается int&&
, он должен вызывать ошибку.
Код компилируется в GCC 6.0.0 (демонстрация).
Код не компилируется в Clang 3.7.0 (демонстрация) с сообщением об ошибке:
error: no known conversion from 'int'
to 'identity<int> &&' (aka 'int &&') for 1st argument
Какой из них прав?