'const decltype ((a))' не объявляет ссылку на константу?

Сегодня я видел такой код:

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 не сработал?


person CyberLuc    schedule 16.06.2015    source источник
comment
const применяется к ссылке (и игнорируется), а не к указанному типу.   -  person T.C.    schedule 16.06.2015
comment
комбинирование decltype с модификаторами работает точно так же, как применение модификаторов к типу typedef-ed. Это НЕ подмена текста.   -  person Ben Voigt    schedule 16.06.2015
comment
@ T.C. @ ben-voigt О, я понял. Итак, const применяется ко всему телу int& как const reference to int, а не просто объединяется с ним как const int&, ссылка на const int ... Верно?   -  person CyberLuc    schedule 16.06.2015
comment
int - это более внутренний тип в типе int&, а const придерживается внешнего, являющегося ссылкой. Просто добавьте const справа и прочтите получившийся тип: const ссылка на int   -  person ixSci    schedule 16.06.2015
comment
@ixSci Спасибо, я полностью понимаю, что вы имеете в виду. Но мне любопытно, почему вы все комментируете, а не отвечаете?   -  person CyberLuc    schedule 16.06.2015


Ответы (1)


Неправильная часть неверна, потому что const применяется к полному типу, который равен int&, а добавление const к int& делает его int& const, который является константной ссылкой на int. Но ссылка const по самой своей природе, поэтому константная часть просто игнорируется. Следовательно, результирующий тип по-прежнему int&

person ixSci    schedule 16.06.2015