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

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

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

constexpr char x = "a"[0];

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

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


person Community    schedule 21.09.2012    source источник


Ответы (1)


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

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

  • an lvalue-to-rvalue conversion (4.1) unless it is applied to
    • a non-volatile glvalue of integral or enumeration type that refers to a non-volatile const object with a preceding initialization, initialized with a constant expression [ Note: a string literal (2.14.5) corresponds to an array of such objects. —end note ] [...]

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

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

person ecatmur    schedule 21.09.2012