C ++ агрегатное поведение инициализатора с массивом данных - PullRequest
0 голосов
/ 28 марта 2020

При изменении порядка массива данных кажется, что data всегда инициализируется агрегатным инициализатором (не alter). Почему?

struct SqList
{
   ElemType alter[MAXSIZE];
   ElemType data[MAXSIZE];//swap order here
   int Length;
};

Разве компилятор не должен рассматривать первый допустимый блок памяти как цель инициализатора?

Прежде всего, у меня есть класс SqList и перегруженный оператор << для печати содержимого. </p>

struct SqList
{
    ElemType data[MAXSIZE];
    ElemType alter[MAXSIZE];
    int Length;
};

ostream& operator<<(ostream& os,const SqList& sql)
{
    for(auto i:sql.data)
        os<<i<<" ";
    os<<"\n";

     for(auto i:sql.alter)
        os<<i<<" ";
    os<<"\n";
    return os;
}

В main () экземпляр SqList создается с агрегатным инициализатором

int main()
{
    SqList s{1,2,3,4,5};
    cout<<s;
}

Интересно видеть, что если я поменяю местами порядок data и alter в SqList, data всегда инициализируется с {1,2,3,4,5}

Здесь - код, если вы заинтересованы.

исследование компилятора

1 Ответ

1 голос
/ 28 марта 2020

если я меняю порядок данных и изменяю в SqList, data всегда инициализируется с {1,2,3,4,5}

Нет, это не наблюдаемое поведение. См., Например, эти две версии: https://godbolt.org/z/VTeheX против https://godbolt.org/z/bkA8zs

Когда вы меняете строки в объявлении класса, в определении перегрузки operator<< ваш код всегда печатает data до alter, а выходные данные (не говоря уже о предупреждениях) двух версий различны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...