Назад к вопросам
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?