Подписывание строковых литералов в константах времени компиляции

Возможный дубликат:
Может ли строковый литерал быть подписан в константном выражении?

Если я подпишу строковый литерал, будет ли результат константой времени компиляции? Другими словами, допустим ли следующий код?

constexpr char x = "a"[0];

GCC 4.7 говорит, что да, но что говорит стандарт по этому вопросу?

Для любопытных: я не могу просто написать 'a', потому что строковый литерал является результатом строкового оператора. У некоторых компиляторов есть оператор вычисления, но это только расширение.

2

Решение

Я думаю, что вы смотрите на 5.19 [expr.const]:

2 — Условное выражение является основным константным выражением, если оно не включает одно из следующих […]

  • преобразование lvalue в rvalue (4.1), если оно не применяется к
    • энергонезависимое glvalue целочисленного типа или типа перечисления, которое относится к энергонезависимому объекту const с
      предшествующая инициализация, инициализированная константным выражением [Примечание: строковый литерал (2.14.5)
      соответствует массиву таких объектов. — конец примечания] […]

Таким образом, результат операции строкового литерала может быть преобразован в значение r в выражении основной константы.

Это полезно при определении операторов constexpr для пользовательских литералов и пользовательских строковых литералов, хотя в некоторых случаях форма с переменным числом может быть более работоспособной.

3

Другие решения

Других решений пока нет …