Объявляет ли decltype (1 + 2) xvalue или prvalue?
cppreference говорит, что decltype (выражение) объявит:
1. Т&& если выражение является xvalue
2. T, если выражение является значением
3. Т& если выражение lvalue
Но мой вопрос: как создать выражение, которое является xvalue? Я предполагаю, что возвращаемое значение и временные объекты должны быть xvalue, но на самом деле они кажутся xvalue, в моем эксперименте:
struct S{};
S f();
int main()
{
int i=2;
decltype(i+1) j=i;
++j;
printf("i=%d\n",i);
S obj;
decltype(f()) k=obj;
return 0;
}
Эта программа компилирует: я мог судить, что
decltype (i + 1) объявляет (i + 1) как значение
потому что если это xvalue, тогда decltype получает T&&, который не может привязаться к левой переменной значения «i». Также странно, что decltype (f ()) также дает мне f () в качестве значения?
Итак, мой вопрос: как написать выражение, чтобы decltype (выражение) давало мне значение x?
Благодарю.
Decltype разрешает тип, а не выражение — вы не можете сказать, что он «объявляет значение» или что-то в этом роде.
i+1
является prvalue, а не id-выражением. Так decltype
дает не ссылочный тип: decltype(i+1) j = i;
средства int j = i;
,
Второй случай похож; f()
это prvalue, так decltype(f())
является S
,
Получить decltype(expression)
чтобы разрешить в ссылочный тип rvalue, выражение должно быть xvalue. Например decltype( std::move(f()) )
является S&&
,
Предположим, что T
не является ссылочным типом. Затем:
T f();
тип decltype(f())
является T
,T& f();
тип decltype(f())
является T&
,T&& f();
тип decltype(f())
является T&&
,Итак, способ получить decltype
чтобы создать ссылку на rvalue, это применить ее к выражению xvalue, например, std::move(1 + 2)
,