2

重複の可能性:
文字列リテラルを定数式で添え字化できますか?

文字列リテラルに添え字を付けると、結果はコンパイル時定数になりますか?つまり、次のコードは有効ですか?

constexpr char x = "a"[0];

GCC 4.7はそうだと言っていますが、この問題に関して標準は何と言っているのでしょうか?

'a'不思議なことに、文字列リテラルは文字列化演算子の結果であるため、単に書くことはできません。一部のコンパイラにはcharizing演算子がありますが、これは単なる拡張機能です。

4

1 に答える 1

3

5.19 [expr.const] を見ていると思います:

2 - 条件式は、次のいずれかを含まない限り、コア定数式です [...]

  • 適用されない限り、左辺値から右辺値への変換 (4.1)
    • 定数式で初期化された、前に初期化された非揮発性 const オブジェクトを参照する整数または列挙型の非揮発性 glvalue [ 注: 文字列リテラル (2.14.5) は、そのようなオブジェクトの配列に対応します。—エンドノート] [...]

そのため、文字列リテラルの添字操作の結果は、コア定数式の右辺値に変換される場合があります。

これは、ユーザー定義のリテラルおよびユーザー定義の文字列リテラルに対して constexpr 演算子を定義する場合に便利ですが、場合によっては可変個引数形式の方がより実行しやすい場合があります。

于 2012-09-21T12:19:27.873 に答える