C++03 ではconst
static
、クラス定義内でクラス データ メンバーをインラインで初期化する機能がありましたが、 odr-usedにする場合はメンバーを定義する 必要がありました。
これは C++11 にも当てはまりますか?
struct Foo
{
static const int x = 3;
};
const int Foo::x;
// ^ required?
[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
。