web-dev-qa-db-ja.com

constexpr const vs constexpr変数?

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は本当に同じですか?

37
Thomas Moulard

問題は、変数宣言では、constexprは常にconst- nessを宣言されたオブジェクトに適用することです。一方、constは、配置に応じて異なるタイプに適用できます。

かくして

constexpr const int i = 3;
constexpr int i = 3;

同等です;

constexpr char* p = nullptr;
constexpr char* const p = nullptr;

同等です;どちらもpconstへのcharポインターにします。

constexpr const char* p = nullptr;
constexpr const char* const p = nullptr;

同等です。 constexprpconstポインターにします。 const char *constは、pconst charを指すようにします。

61
T.C.

表示されるエラーメッセージは、constexprキーワード自体とは関係ありません。

次のような「foo」のような文字列リテラル

somefunction("foo");

この文字列リテラルのタイプはconst char *です。次のステートメント:

char *const str = "foo";

これは、const char *値をchar *値に割り当てようとします。結果のchar *値は不変、定数ですが、その時までにエラーが既に発生しています:const char *char *に変換しようとしました。

この例のconstexprキーワードは単なる注意散漫であり、エラーには関係ありません。

3
Sam Varshavchik