C ++ 11: «decltype (1 + 2)» объявить xvalue или prvalue?

Объявляет ли 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?
Благодарю.

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&&,

5

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

Предположим, что T не является ссылочным типом. Затем:

  • За T f();тип decltype(f()) является T,
  • За T& f();тип decltype(f()) является T&,
  • За T&& f();тип decltype(f()) является T&&,

Итак, способ получить decltype чтобы создать ссылку на rvalue, это применить ее к выражению xvalue, например, std::move(1 + 2),

3

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