Как работает в данном коде decltype?

Рейтинг: 0Ответов: 2Опубликовано: 13.05.2023

Объясните, пожалуйста, почему decltype навешивает ссылку:

int x = 1;
decltype(x++) t1 = x;//int t1
decltype(++x) t2 = x;//int& t2

Ответы

▲ 2Принят

В документации можно посмотреть правила, по которым работает decltype. В данном случае интересны:

  • if the value category of expression is xvalue, then decltype yields T&&;
  • if the value category of expression is lvalue, then decltype yields T&;
  • if the value category of expression is prvalue, then decltype yields T.

x++ возвращает prvalue, поэтому T = int, ++x возвращает lvalue, поэтому T& = int&.

Простыми словами в данном случае prvalue отличается от lvalue тем, что второе можно дальше модицифицировать (т.е. ++++x OK, а x++++ - нет), это и демонстрируется ссылкой. Подробнее про типы выражений лучше почитать отдельные ответы или документацию.

▲ 1

Префиксные и постфиксные инкременты/декременты не только работают по-разному но и возвращают значения разных типов. Если префикс возвращает T&, то постфикс - T. Это отражено в документации к перегрузке этих операторов. Примитивные типы не имеют функций-членов типа operator++, но работают по тем же правилам. А decltype просто берёт тип выражения, вот и всё. Формально всё немного запутаннее, но по сути так понятнее думаю.