GCC 4.6.1 で、デフォルトのコンストラクターを持つ独自の型のインスタンスを宣言し、その型のオブジェクトをインスタンス化して中かっこ ( Foo my_foo{}; など) で初期化すると、そのクラスの POD メンバー他のコンストラクターが宣言されていない場合にのみゼロ初期化します。デフォルトのもの以外に他のコンストラクターがない場合、期待どおりにゼロ初期化されます。
しかし、GCC 4.7.3 では、どちらの方法でもゼロ初期化が行われます。これは、私が期待した動作です。
ここの違いは何ですか?これはコンパイラのバグですか? これらの GCC バージョンは両方とも、C++11 標準のデフォルトのコンストラクターをサポートしています。
古い GCC バージョンに固執する必要はありませんが、ここで何が起こっているのかを理解したいと思います。
注:メインのctor、op =をデフォルトにしています。可変個引数関数で型を使用できるようにするためだけに ctor をコピーします (clang は、クラスを POD として分類するためにこれを要求しますが、gcc では、ユーザー定義のメイン ctor であっても、可変個引数関数で型を使用することを回避できます。私はなぜ。)
以下は、(両方の GCC バージョンでコンパイルされたバイナリからの) 下部にいくつかの出力を含む、説明するためのサンプル プログラムです。
#include <cstdio>
// pod and pod_wctor are identical except that pod_wctor defines another ctor
struct pod {
pod( void ) = default;
pod( const pod& other ) = default;
pod& operator=( const pod& other ) = default;
int x,y,z;
};
struct pod_wctor {
pod_wctor( void ) = default;
pod_wctor( const int setx, const int sety, const int setz ) : x(setx), y(sety), z(setz) { }
pod_wctor( const pod_wctor& other ) = default;
pod_wctor& operator=( const pod_wctor& other ) = default;
int x,y,z;
};
int main ( void ) {
printf("the following shuold be uninitialized:\n");
pod pee;
printf( " %i,%i,%i\n", pee.x, pee.y, pee.z);
pod_wctor podtor;
printf( " %i,%i,%i\n", podtor.x, podtor.y, podtor.z);
printf("the following shuold be initialized to 0,0,0:\n");
pod peenit{};
printf( " %i,%i,%i\n", peenit.x, peenit.y, peenit.z );
pod_wctor podtornit{};
printf( " %i,%i,%i\n", podtornit.x, podtornit.y, podtornit.z );
return 0;
}
// compiled with: g++ m.cpp -std=gnu++0x
// g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 (i386)
/****************** output *******************
the following shuold be uninitialized:
10381592,134513249,134520820
134513969,134513504,0
the following shuold be initialized to 0,0,0:
0,0,0
7367877,134513945,8724468
*********************************************/
// compiled with: g++ m.cpp -std=gnu++0x
// gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu4) (i386)
/****************** output *******************
the following shuold be uninitialized:
-1218358300,-1217268232,134520832
134514450,1,-1079827548
the following shuold be initialized to 0,0,0:
0,0,0
0,0,0
*********************************************/