Я пытаюсь понять, как lvalues связывают ссылки rvalue. Рассмотрим этот код:lvalue binding to rvalue reference
#include <iostream>
template<typename T>
void f(T&& x) {
std::cout << x;
}
void g(int&& x) {
std::cout << x;
}
int main() {
int x = 4;
f(x);
g(x);
return 0;
}
В то время как вызов F() в порядке, вызов г() дает ошибку во время компиляции. Этот вид привязки работает только для шаблонов? Зачем? Можем ли мы как-то это сделать без шаблонов?
Это имеет смысл. Но предположим, что мне не нужны шаблоны, тогда есть ли способ получить универсальные ссылки, скажем, в примере выше? Я немного изменил этот вопрос. –
@ r.v Вы можете предоставить вторую перегрузку 'g' для lvalues (' void g (int &) '), или вы можете * переместить * lvalues с помощью' std :: move'. – 0x499602D2
Да, это возможные решения, но я надеялся, что мы получим что-то в строке универсальной ссылки: учитывая тип T (фиксированный, не templated), я могу сопоставлять T & и T && в одном вызове (без перегрузок), а затем использовать пересылку и т. д. Это определенно помогает уменьшить некоторый избыточный код. –