Согласно https://en.cppreference.com/w/cpp/language/reference, ссылки на пересылку являются либо
- функциональным параметром шаблона функции, объявленным как ссылка на значение.
- auto &&.
Здесь, в https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers Скотт Мейерс объяснил, что, хотя vector :: push_back (T && x) принимает T &&, это не универсальная ссылка. Это просто простая ссылка на rvalue.
Однако мой приведенный ниже код компилируется и работает хорошо:
#include <iostream>
template<typename T>
class MyClass
{
public:
void f(T&& x)
{
std::cout << __FUNCSIG__ << std::endl;
}
};
int main()
{
int i = 10;
MyClass<int&> myClass1;
myClass1.f(i); //void __thiscall MyClass<int &>::f(int &)
MyClass<int&&> myClass2;
myClass2.f(10); //void __thiscall MyClass<int &&>::f(int &&)
}
Похоже, T && здесь рассматривается как ссылка для пересылки, потому что f (T && x) принимает ссылки как lvalue, так и rvalue. Но f (T && x) является членом шаблона класса; это не автономный шаблон функции. Это противоречит определению ссылки на пересылку, которое я упомянул выше?
<< \ ADD ->
В случае ссылки на пересылку в шаблоне функции сам шаблон функции также должен создание экземпляра на основе специфицированного c типа T. Мы можем express это явно:
template<class T>
void f(T&& x)
{}
int main() {
int i = 10;
f<int&>(i); // argument is lvalue
f<int&&>(10); // argument is rvalue
}
f <\ int &> и f <\ int &&> - два разных экземпляра вышеуказанного шаблона функции. Они также не указывают на один и тот же адрес функции за кулисами, как в случае создания шаблона класса. Конечно, нам нужен объект класса, чтобы использовать его функции.
<- End ADD>