MiddleКодРедкоЕщё не отвечали
Что выведет этот список инициализации членов?
Предскажите вывод — обратите внимание на порядок в списке инициализации.
struct S {
int a;
int b;
S(int x) : b(x), a(b) {} // обратите внимание на порядок здесь
};
int main() { S s(5); std::cout << s.a << " " << s.b; }
Определите вывод и объясните.
s.b равно 5, но s.a — мусор. Члены инициализируются в порядке объявления (a, затем b), а не в порядке записи в списке инициализации, поэтому a(b) выполняется первым и читает b до его установки. Ловится сборкой с -Wreorder.
- ✗Считать, что порядок в списке инициализации определяет инициализацию
- ✗Ожидать ошибку компиляции вместо чтения неинициализированного члена
- ✗Не знать, что
-Wreorderпредупреждает о расхождении списка и объявления
- →Почему стандарт привязывает инициализацию к порядку объявления?
- →О чём именно предупреждает
-Wreorder?