Как работает в данном коде decltype?
Объясните, пожалуйста, почему decltype
навешивает ссылку:
int x = 1;
decltype(x++) t1 = x;//int t1
decltype(++x) t2 = x;//int& t2
Объясните, пожалуйста, почему decltype
навешивает ссылку:
int x = 1;
decltype(x++) t1 = x;//int t1
decltype(++x) t2 = x;//int& t2
В документации можно посмотреть правила, по которым работает decltype
. В данном случае интересны:
x++
возвращает prvalue, поэтому T = int, ++x
возвращает lvalue, поэтому T& = int&.
Простыми словами в данном случае prvalue отличается от lvalue тем, что второе можно дальше модицифицировать (т.е. ++++x
OK, а x++++
- нет), это и демонстрируется ссылкой. Подробнее про типы выражений лучше почитать отдельные ответы или документацию.
Префиксные и постфиксные инкременты/декременты не только работают по-разному но и возвращают значения разных типов. Если префикс возвращает T&
, то постфикс - T
. Это отражено в документации к перегрузке этих операторов. Примитивные типы не имеют функций-членов типа operator++
, но работают по тем же правилам. А decltype
просто берёт тип выражения, вот и всё. Формально всё немного запутаннее, но по сути так понятнее думаю.