C++11: объявляет ли decltype(1+2) xvalue или prvalue?
Объявляет ли decltype(1+2) xvalue или prvalue?
cppreference говорит, что decltype (выражение) объявит: 1. T&&, если выражение является значением xvalue 2. T, если выражение является значением prvalue 3. T& if, если выражение равно 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? Благодарю.
2 ответа
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)
,