読者です 読者をやめる 読者になる 読者になる

C++0xではPODでもコンストラクタ相当のことができる・・・?

C++

PODの構造体があったとき、メンバ変数の初期値を指定したい、というモチベーションがあったりするのですが、PODは非自明なコンストラクタを書けないので以下はNGになります。

struct S {
    int x;

    S() : x(3) {} // NG : これだとPODにならない
};

C++0xではメンバ変数の初期化をメンバ変数定義時に行うことができ、コンストラクタで明示的な初期化を書かない場合のデフォルト値を指定できるのですが、現時点でのドラフトを読む限り、非自明なコンストラクタを書いたことにはなりそうにないので、以下のように書いてもPODになりそう。

struct S {
    int x = 3;
};

ほんとかな。ちょっと怪しい。


追記:
できないっぽいです。

@cpp_akira p252 12.1.5で、A def-ctor is trivial if ... and if ... no non-static data member of its class has a brace-or-equal-initializerなのでless than a minute ago via Tween

@cpp_akira (続き) 初期値付きのnon-staticデータメンバを持っているとデフォルトコンストラクタがtrivialではないので、そのクラスもtrivialではなくなり、つまりPODでもなくなるようですless than a minute ago via Tween

trivialなデフォルトコンストラクタというのはすべてのデータメンバを不定値で初期化することしか出来ないようで。。。less than a minute ago via Tween

N2628 Non-static data member initializers

C++0x POD再考