2014-10-02

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

1 comment:

  1. vcが超絶バージョンアップすることを切に願っています。
    デバッガ中毒なので離れられません。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.