Constexprがconstを暗示していることは明らかであるため、よく見られます。
constexpr int foo = 42; // no const here
ただし、次の場合:
constexpr char *const str = "foo";
-Wwrite-stringフラグが渡されると、GCCは「警告:文字列定数から「char *」への非推奨の変換」を生成します。
書き込み:
constexpr const char *const str = "foo";
問題を解決します。
Constexpr constとconstexprは本当に同じですか?
問題は、変数宣言では、constexpr
は常にconst
- nessを宣言されたオブジェクトに適用することです。一方、const
は、配置に応じて異なるタイプに適用できます。
かくして
constexpr const int i = 3;
constexpr int i = 3;
同等です;
constexpr char* p = nullptr;
constexpr char* const p = nullptr;
同等です;どちらもp
をconst
へのchar
ポインターにします。
constexpr const char* p = nullptr;
constexpr const char* const p = nullptr;
同等です。 constexpr
はp
をconst
ポインターにします。 const char *
のconst
は、p
がconst char
を指すようにします。
表示されるエラーメッセージは、constexpr
キーワード自体とは関係ありません。
次のような「foo」のような文字列リテラル
somefunction("foo");
この文字列リテラルのタイプはconst char *
です。次のステートメント:
char *const str = "foo";
これは、const char *
値をchar *
値に割り当てようとします。結果のchar *
値は不変、定数ですが、その時までにエラーが既に発生しています:const char *
をchar *
に変換しようとしました。
この例のconstexpr
キーワードは単なる注意散漫であり、エラーには関係ありません。