4

C++03 ではconst static、クラス定義内でクラス データ メンバーをインラインで初期化する機能がありましたが、 odr-usedにする場合はメンバー定義する 必要がありました。

これは C++11 にも当てはまりますか?

struct Foo
{
   static const int x = 3;
};

const int Foo::x;
// ^ required?
4

1 に答える 1

8

はい。

[C++11: 9.4.2/3]: 不揮発性const staticデータ メンバーが整数型または列挙型の場合、クラス定義でのその宣言は、代入式であるすべての初期化子句が定数式(5.19)であるブレースまたはイコール初期化子を指定できます。リテラル型のデータ メンバーは、指定子staticを使用してクラス定義で宣言できます。constexprその場合、その宣言は、割り当て式であるすべての初期化子節が定数式であるブレースまたは等号初期化子を指定するものとします。[ 注:どちらの場合も、メンバーは定数式に現れることがあります。—終わりのメモ] メンバーは、プログラムで ODR 使用 (3.2) され、名前空間スコープ定義に初期化子が含まれていない場合でも、名前空間スコープで定義されます。

これは、C++03 の文言に匹敵します。

[C++03: 9.4.2/2]:静的データ メンバーがconst整数型またはconst列挙型の場合、クラス定義でのその宣言は、整数定数式 (5.19) である定数初期化子を指定できます。その場合、メンバーは整数定数式に表示できます。メンバーがプログラムで使用され、名前空間スコープの定義に初期化子が含まれていない場合、メンバーは名前空間スコープで定義されます。

ご覧のとおり、ルール自体は、 のルールの導入以外はまったく変更されていませんconstexpr

于 2013-04-24T11:27:39.937 に答える