Возможный дубликат:
Может ли строковый литерал быть подписан в константном выражении?
Если я подпишу строковый литерал, будет ли результат константой времени компиляции? Другими словами, допустим ли следующий код?
constexpr char x = "a"[0];
GCC 4.7 говорит, что да, но что говорит стандарт по этому вопросу?
Для любопытных: я не могу просто написать 'a'
, потому что строковый литерал является результатом строкового оператора. У некоторых компиляторов есть оператор вычисления, но это только расширение.
Я думаю, что вы смотрите на 5.19 [expr.const]:
2 — Условное выражение является основным константным выражением, если оно не включает одно из следующих […]
- преобразование lvalue в rvalue (4.1), если оно не применяется к
- энергонезависимое glvalue целочисленного типа или типа перечисления, которое относится к энергонезависимому объекту const с
предшествующая инициализация, инициализированная константным выражением [Примечание: строковый литерал (2.14.5)
соответствует массиву таких объектов. — конец примечания] […]
Таким образом, результат операции строкового литерала может быть преобразован в значение r в выражении основной константы.
Это полезно при определении операторов constexpr для пользовательских литералов и пользовательских строковых литералов, хотя в некоторых случаях форма с переменным числом может быть более работоспособной.
Других решений пока нет …