rundll32
@rundll32

Почему работает const, а не constexpr для char*?

Прочитал, что разница между const и constexpr только в том, что во втором случае константа должна быть времени компиляции, а не выполнения. Почему тогда вторая строка с ошибкой?
const char* str = "hello world";
constexpr char* str2 = "hello world";

P.S. Давно не заходил в плюсы, но, кажется, раньше и без const можно было, сейчас же VS ошибку выдает.
  • Вопрос задан
  • 758 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Дело в том, что указанный слева квалификатор const относится к правой половине спецификации типа до первого модификатора.
const char& - ссылка на константный символ. Квалификатор - const, модификатор - &.
const char* - указатель на память константного символа. Квалификатор - const, модификатор - *.

При этом, указанный справа квалификатор const относится ко всей части спецификации типа левее, включая все модификаторы.
char* const - константный указатель на память символа.
const char* const - константный указатель на память константного символа.
char* const * - указатель на память константного указателя на память символа.
char& const существовать не может, т.к. квалификаторы не применяется к ссылкам. Тут будет ошибка трансляции.

И при чем же здесь constexpr? Просто constexpr всегда относится только ко всей спецификации типа со всеми модификаторами.
const char* - указатель на память константного символа.
constexpr char* - константный указатель времени компиляции на память символа. Тут нет ошибки, память символа тут считается модифицируемой.

И если объект с типом constexpr char* получит характеристику ODR-used [?], то после трансляции кода это будет уже объект с типом char* const. Вот так.
В то же время, строковые литералы имеют тип const char[N], т.е. статически определенный массив константных символов. Такой тип можно привести только к типу const char*.

В результате, чтобы правильно определить константный указатель времени компиляции на память константного символа, нужно тип определить как constexpr const char*.
И const в этом месте никакого прямого отношения к constexpr не имеет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы