Я пытаюсь понять объявления вложенных структур и почему компилируется следующее. Компилируется ли func только после анализа полного определения класса, или это связано со встраиванием, в этот момент определение X становится доступным? Тогда почему создание экземпляра переменной-члена не компилируется?
Всегда ли это гарантированно компилируется по стандарту C++?
struct Y {
// X x1; Does not compile
void func() {
X x;
x.z = 12;
}
struct X {
int z;
};
};
int main() {
Y y;
y.func();
}
Да, тело метода компилируется после того, как известно все определение класса. Итак, это действительный C++.





Встраивание касается только производительности и не влияет на корректность программы.
Простой ответ заключается в том, что тела функций обрабатываются в конце включающего класса (если классы вложенные, даже функции во вложенном классе обрабатываются в конце самого внешнего включающего класса).
Я не знаю, стоит ли мне задавать по этому поводу отдельный вопрос, но почему ``` void func1(X x){}``` не компилируется. X в данном случае технически используется вне тела функции? Но в любом случае, почему существует разница в поведении между этими вариантами использования?
@user3882729 user3882729 Да, это вне тела. Наверное, нельзя облегчать жизнь разработчикам компиляторов.
в определении функции-члена доступно определение класса. То же самое и с обычным участником
Y