Я пришел с этим чувством, когда играл с ссылками на constexpr. Но сам вопрос не связан с constexpr, он просто раскрывается им.
Мы знаем, что существуют «указатели на const» и существуют «указатели const». Кстати, поскольку последние используются гораздо реже, чем первые, их имя часто используется для обозначения первых. Во всяком случае, нет никакого различия для ссылок, так как они не могут быть повторно привязаны. Таким образом, у нас есть только «ссылки на const», а не «ссылки на const». Это общая терминология, и она используется в стандарте. Но мне это не кажется правильным.
Давайте рассмотрим некоторые хорошо известные примеры, прокомментированные с помощью этой общей терминологии:
int i = 0; // Value
int* pi = &i; // Pointer to i
const int* cpi = &i; // Pointer to const i
int const* cpi = &i; // Pointer to const i (east-const style)
int* const pci = &i; // Const pointer to i
int& ri = i; // Reference to i
const int& rci = i; // Const reference to i
int const& rci = i; // Const reference to i (east-const style)
Теперь давайте подробнее рассмотрим несколько строк. из вышесказанного:
const int* cpi = &i; // Pointer to const i
const int& rci = i; // Const reference to i
const int*
объявляет "указатель на const", а const int&
объявляет "ссылку на const". Тот же порядок в объявлении, другой порядок в значении. Здесь есть явное несоответствие. Но если мы назовем это «ссылкой на const», несогласованность исчезнет. Одинаковый порядок с обеих сторон.
Напряжение усиливается с введением constexpr
:
constexpr int& cri = i; // Constexpr reference to i
constexpr const int& crci = i; // Constexpr const reference to i
Ссылка "Constexpr const"? А? В документации четко сказано :
Спецификатор constexpr
, используемый в объявлении объекта, подразумевает const
.
Ссылка - это объект. Так зачем нам нужно const
, когда оно уже constepxr
? .. И все же оно нам нужно, если i
является постоянным. Выглядит разочаровывающим.
Но разочарования больше нет с помощью «ссылки на const». Давайте назовем crci
"ссылка constexpr на const i". Теперь ясно, что const
применяется к ссылочному объекту, в то время как constexpr
применяется к самой ссылке , подтверждая тот факт, что она может использоваться в контексте constexpr. А также, что это const, так как все ссылки являются постоянными. Имеет смысл. Чтобы сделать его более совместимым с указателями, мы могли бы даже использовать следующий гипотетический синтаксис:
const int& constexpr crci = i; // Constexpr reference to const i
const int* const pci = &i; // Const pointer to const i (perfect consistency)
Но это не так, как работает C ++, к лучшему или к худшему.
Это понятие "ссылка на const «действительно помогла мне понять» вещь constprst const reference *
Что вы думаете? Вам кажется убедительным понятие «ссылка на const»?