|
分類:[C/C++]
環境:Visual C++ 2008
C互換構造体ゼロ初期化に関する解釈についてご教示ください。
下記の(A)のような記述をしたら、先輩に怒られてしまいました。
なぜだめなのか理解できません。
// C互換構造体
struct Hoge
{
int i;
double d;
void* p;
};
int _tmain(int argc, _TCHAR* argv[])
{
Hoge a = {};
// ここで Hoge a を書き換えるような処理を実行
a.i = 1;
a.d = 2.345;
a.p = &_tmain;
std::cout << a.i << std::endl << a.d << std::endl << a.p << std::endl;
// (A)ここで Hoge a をゼロクリア
a = Hoge();
std::cout << a.i << std::endl << a.d << std::endl << a.p << std::endl;
return 0;
}
ゼロクリアされるのは、()による値初期化で非静的メンバーが各々ゼロクリアされるからという解釈で正しいですか?
JIS X3014:2003 の 8.5 初期化子 を読むと、
7 に《初期化子》の括弧の中が空(すなわち、())のオブジェクトには値初期化を行わなければならない。
とあり、
5 に T型のオブジェクトの値初期化とは、次のいずれかを意味する。
- Tが利用者定義コンストラクタを持たないクラス型の場合、Tの各非静的データメンバ及び各規定クラス成分を値初期化する。
- Tが配列型の場合、各要素に対し値初期化を行う。
- そうでない場合、そのオブジェクトをゼロ初期化する。
とあるので、利用者定義コンストラクタを持たないクラス型であるC互換構造体型にはこれが適用されると解釈しています。
また、その結果、
・各メンバが各々ゼロ初期化される。
・各メンバはスカラ型なので0を型変換した値が設定される。
(よってポインタや浮動少数の内部表現は関係ない)
・パディング領域がゼロクリアされるかどうかは実装依存。
ということになると考えています。
なので、まったく問題ないと考えているのですが。
この解釈で正しいですか?
|