В приведенном ниже коде 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, похоже, это не так.
rvalref
является идентификатором для объекта. Идентификатор объекта всегда является lvalue.
Выражения никогда не имеют ссылочного типа. Выражение rvalref
имеет тип int
и значение категории «lvalue».
В декларации int && rvalref
, &&
описывает как rvalref
будет инициализирован (то есть путем добавления нового имени к объекту, обозначенному другим выражением, а не к созданию нового объекта), и все.
В выражении поведение имени объекта одинаково, независимо от того, было ли имя первым именем, данному этому объекту.
Код decltype(identifier)
имеет особое поведение по сравнению с decltype(general_expression)
, Он не дает тип и категорию значения выражения, состоящего из этого идентификатора. Код decltype((identifier))
сделал бы это. дальнейшее чтение
Других решений пока нет …