C++14の新機能: メンバー初期化子と初期化リストの組み合わせ
N3605: Member initializers and aggregates
さて、今回解説するC++14の新機能は、機能というよりは、変更といった方がいい小規模なものだ。そして、本来ならば、メンバー初期化子とアグリゲートというべきなのだが、わかりやすさのために初期化リストとしておいた。
C++では、特定の条件を満たしたクラスをアグリゲートと呼び、C言語から受け継いだメンバーごとの初期化ができる。
struct X
{
int a ;
int b ;
} ;
X x = { 1, 2 } ;
// x.a == 1
// x.b == 2
C++11には、メンバー初期化子という新機能が追加された。これは、クラスのデータメンバーの宣言に、初期化子を記述できる機能だ。
struct X
{
int data = 0 ;
} ;
X x ; // x.data == 0
C++11では、この二つの初期化を組み合わせることができない。
// C++11ではエラー
struct X
{
int a ;
int b = 0 ;
} ;
// エラー
X x = { 0 } ;
これは、C++11の定義では、メンバー初期化子のあるクラスはアグリゲートではなくなるからだ。
C++14では、メンバー初期化子があってもクラスがアグリゲートの条件を満たすようにし、メンバー初期化子とアグリゲートによる初期化を組み合わせて使えるように、制限を緩和した。
struct X
{
int a ;
int b = 2 ;
} ;
// C++14ではwell-formed
X x = { 1 } ;
// x.a == 1
// x.b == 2
これもconstexpr関数の制限緩和と同じで、プログラマーが難しいことを考えずに、普通に、自然に書いたコードがそのまま動くようにするための変更だ。
なおこの機能はClang 3.4で実装されている。GCCではまだ実装されていない。
Clang - C++1z, C++14, C++11 and C++98 Status
C++1y/C++14 Support in GCC - GNU Project - Free Software Foundation (FSF)
See Also:
本の虫: C++14の新機能: decltype(auto)
本の虫: C++14の新機能: 初期化lambdaキャプチャー
本の虫: C++14の新機能: constexpr関数の制限緩和
ドワンゴ広告
この記事もドワンゴ勤務中に書かれた。
今日は新機能というより、制限緩和ばかり紹介している。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0