Почему rval ref связан с функцией lval ref?

В приведенном ниже коде is_rvalue_reference возвращает истину.
Я бы ожидал testRef(int &&) быть призванным, а не testRef(int &), но это не так (по крайней мере, с моим компилятором Visual Studio 2015).

Любая идея о причине, почему?

void testRef( int&& i )
{
cout << "called testRef(int&&) " << endl;
}

void testRef( int& i )
{
cout << "called testRef(int&) " << endl;
}

int main()
{
int && rvalref = 4;
cout << "is rval? : " << std::is_rvalue_reference<decltype( rvalref )>() << endl;
testRef( rvalref );
}

Обратите внимание, что это отличается от вопроса в Ссылка Rvalue рассматривается как Lvalue?

В этом посте они говорят о переменной внутри функция: это все равно что спрашивать, является ли в моем примере переменная i значением r или значением l (ответ в том, что в обоих случаях это значение l, потому что в обоих случаях у него есть адрес).

Весь смысл наличия значений и std::move, который приведен к rvalue, позволяет выбрать правильную перегрузку в функциях и конструкторах.
Например, оба следующих случая разрешают вызов testRef(int && i):

int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}

Но со ссылкой на rvalue, похоже, это не так.

1

Решение

rvalref является идентификатором для объекта. Идентификатор объекта всегда является lvalue.

Выражения никогда не имеют ссылочного типа. Выражение rvalref имеет тип int и значение категории «lvalue».

В декларации int && rvalref, && описывает как rvalref будет инициализирован (то есть путем добавления нового имени к объекту, обозначенному другим выражением, а не к созданию нового объекта), и все.

В выражении поведение имени объекта одинаково, независимо от того, было ли имя первым именем, данному этому объекту.

Код decltype(identifier) имеет особое поведение по сравнению с decltype(general_expression), Он не дает тип и категорию значения выражения, состоящего из этого идентификатора. Код decltype((identifier)) сделал бы это. дальнейшее чтение

1

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

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

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