Сегодня я видел такой код:
int a = 0;
const decltype((a)) x = 10; // Error
const int b = 0;
decltype ((b)) y = 42; // Correct
Я могу понять, почему правильный код правильный, но я не могу понять, почему неправильный код неверен.
Я протестировал его, и он показался мне немного странным.
const decltype((a)) x = 10;
Это должно определять const int&
правильно? Но он не компилируется! error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'
.
Я изменил его на const decltype((a)) x = a;
, затем он компилируется.
Что ж, x
ссылка на константу? Нет, я обнаружил, что это неконстантная ссылка. Я могу изменить значение a
через x
.
Почему модификатор const
не сработал?
const
применяется к ссылке (и игнорируется), а не к указанному типу. - person T.C.   schedule 16.06.2015decltype
с модификаторами работает точно так же, как применение модификаторов к типуtypedef
-ed. Это НЕ подмена текста. - person Ben Voigt   schedule 16.06.2015const
применяется ко всему телуint&
какconst reference to int
, а не просто объединяется с ним какconst int&
, ссылка на const int ... Верно? - person CyberLuc   schedule 16.06.2015int
- это более внутренний тип в типеint&
, а const придерживается внешнего, являющегося ссылкой. Просто добавьте const справа и прочтите получившийся тип: const ссылка на int - person ixSci   schedule 16.06.2015