Согласно msvc, gcc и clang, следующий код является незаконным:
template <typename T>
void f(T&& e) {
std::vector<T> v;
// do something with v and e ...
}
int main() {
int i;
f(i);
}
msvc дает
xmemory0 (591): ошибка C2528: "указатель": указатель на ссылку незаконное
gcc и clang дают похожие звуковые сообщения об ошибках. Обратите внимание, что универсальный опорный параметр e
не используется. Компилятор, очевидно, не создает экземпляр вектора v
, жалуясь на то, что он используется со ссылкой на int
:
note: см. ссылку на экземпляр шаблона класса
'std::vector<T,std::allocator<_Ty>>'
скомпилировано с[ T=int &, _Ty=int & ]
Но я не вижу, где создается шаблон функции f
со ссылкой на int
.
Может кто-нибудь объяснить ошибки компилятора, которые мы видим здесь?