本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

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の新機能: 2進数リテラル

本の虫: C++14の新機能: decltype(auto)

本の虫: C++14の新機能: 関数の戻り値の型推定

本の虫: C++14の新機能: 初期化lambdaキャプチャー

本の虫: C++14の新機能: 変数テンプレート

本の虫: C++14の新機能: constexpr関数の制限緩和

ドワンゴ広告

この記事もドワンゴ勤務中に書かれた。

今日は新機能というより、制限緩和ばかり紹介している。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0