ページ 1 / 1
空のinitializer_listに関して
Posted: 2015年12月19日(土) 16:09
by deny
以下のコードのように
initializer_listを引数に取る代入演算子を持ったクラスを用意し、そのインスタンスに空のinitializer_listを与えるとメンバ変数に
0が代入されているようです。
しかしこの時initializer_listは要素を持っていないのですから、そのイテレータは関係の無い場所を指しているのではないかと思うのですが、何故うまい具合に
0が代入されるのでしょうか?
使用言語はC++11、使用コンパイラはVisual C++ Compiler November 2013 CTPです。
コード:
#include <initializer_list>
#include <iostream>
struct S {
S& operator=(std::initializer_list<int>&& il) {
auto it = il.begin();
a = *it;
b = *(it + 1);
return *this;
}
int a, b;
};
int main()
{
S s;
s = {};
std::cout << s.a << " " << s.b;
//-> 0 0
return 0;
}
Re: 空のinitializer_listに関して
Posted: 2015年12月19日(土) 16:32
by V30
クラスの作りがどうであれ、
で、全てのメンバ変数を0初期化しているからだと思います。
Re: 空のinitializer_listに関して
Posted: 2015年12月19日(土) 16:44
by tk-xleader
偶然です。空のinitializer_listにbegin()を呼び出した場合の戻り値はunspecified(不定)なので、どんな値であっても、というかどのようなことが起ころうと文句が言えないということになります。
Re: 空のinitializer_listに関して
Posted: 2015年12月19日(土) 17:33
by みけCAT
tk-xleader さんが書きました: 偶然です。空のinitializer_listにbegin()を呼び出した場合の戻り値はunspecified(不定)なので、どんな値であっても、というかどのようなことが起ころうと文句が言えないということになります。
Wandboxで試した所、確かにデタラメな値になりました。
たまたまメモリに0が入っていたのか、それともたまたまコンパイラが0に初期化するコードを吐いたのかは、コンパイラが出力するアセンブリ言語のコードを見るとわかるかもしれません。
Re: 空のinitializer_listに関して
Posted: 2015年12月19日(土) 18:58
by deny
tk-xleaderさん、みけCATさん
やはり偶然の産物だったのですね……
使う段になった時はsize関数で判定するように致します。
V30さん
今回の例のようにアグリゲートなクラスでしたら、宣言の際にはゼロ初期化されるかとは思うのですが、果たしてただの代入でゼロ初期化は起こるんですかね?
改めて調べてみることにします。
皆さん、回答ありがとうございました。
解決チェック入れておきますね。