web-dev-qa-db-ja.com

const char * constを使用してconstexprを説明する

私は次のコードを持っています:

static constexpr const char*const myString = "myString";

違いは何ですか?

static const char*const myString = "myString";

この場合のconstexprの新機能は何ですか?

15
demonplus

違いは、C++標準(9.4.2静的データメンバー)からの次の引用で説明されています。

3不揮発性const静的データメンバーが整数型または列挙型である場合、クラス定義での宣言は、brace-or-equal-initializerを指定できます。ここで、割り当て式であるすべての初期化子句定数式です(5.19)。 リテラル型の静的データメンバーは、constexpr指定子を使用してクラス定義で宣言できます。その場合、その宣言はブレースまたはイコールイニシャライザーを指定する必要がありますであるすべての初期化子句代入式は定数式です。 [注:これらのどちらの場合でも、メンバーは定数式に現れる場合があります。 —end note]プログラムでメンバーがodr-used(3.2)であり、名前空間スコープ定義に初期化子が含まれていない場合、メンバーは名前空間スコープで定義されます。

たとえば2つのプログラムを考えてみましょう

struct A
{
    const static double x = 1.0;
};

int main() 
{
    return 0;
}

struct A
{
    constexpr static double x = 1.0;
};

int main() 
{
    return 0;
}

最初のものはコンパイルされませんが、2番目のものはコンパイルされます。

ポインターについても同様です

このプログラム

struct A
{
    static constexpr const char * myString = "myString";
};

int main() 
{
    return 0;
}

このポーグラムをコンパイルします

struct A
{
    static const char * const myString = "myString";
};

int main() 
{
    return 0;
}

コンパイルされません。

12