空のinitializer_listに関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
deny

空のinitializer_listに関して

#1

投稿記事 by deny » 4年前

以下のコードのように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;
}

アバター
V30
記事: 21
登録日時: 5年前
住所: 岡山県

Re: 空のinitializer_listに関して

#2

投稿記事 by V30 » 4年前

クラスの作りがどうであれ、

コード:

s = {};
で、全てのメンバ変数を0初期化しているからだと思います。
素人的な質問は、素人に聞こう!

危ない危ない。
ちゃんとした人に質問しましょう。
ちなみに私は、ちゃんとしていない素人です。

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: 空のinitializer_listに関して

#3

投稿記事 by tk-xleader » 4年前

 偶然です。空のinitializer_listにbegin()を呼び出した場合の戻り値はunspecified(不定)なので、どんな値であっても、というかどのようなことが起ころうと文句が言えないということになります。

アバター
みけCAT
記事: 6274
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 空のinitializer_listに関して

#4

投稿記事 by みけCAT » 4年前

tk-xleader さんが書きました: 偶然です。空のinitializer_listにbegin()を呼び出した場合の戻り値はunspecified(不定)なので、どんな値であっても、というかどのようなことが起ころうと文句が言えないということになります。
Wandboxで試した所、確かにデタラメな値になりました。
たまたまメモリに0が入っていたのか、それともたまたまコンパイラが0に初期化するコードを吐いたのかは、コンパイラが出力するアセンブリ言語のコードを見るとわかるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

deny

Re: 空のinitializer_listに関して

#5

投稿記事 by deny » 4年前

tk-xleaderさん、みけCATさん
やはり偶然の産物だったのですね……
使う段になった時はsize関数で判定するように致します。

V30さん
今回の例のようにアグリゲートなクラスでしたら、宣言の際にはゼロ初期化されるかとは思うのですが、果たしてただの代入でゼロ初期化は起こるんですかね?
改めて調べてみることにします。

皆さん、回答ありがとうございました。
解決チェック入れておきますね。

閉鎖

“C言語何でも質問掲示板” へ戻る