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

Другие вопросы по тегам