В соответствии со стандартом С++
9.2 [class.mem]:
Класс считается полностью определенным типом объекта (3.9) (или полный тип) при закрытии} спецификатора класса. В рамках класса, класс считается полным в пределах функциональные тела, аргументы по умолчанию, использование-объявления, представляющие наследующие конструкторы (12.9), спецификации исключений и скопированные или равные инициализаторы для нестатических членов данных (в том числе такие вещи во вложенных классах). В противном случае он считается неполным в пределах своей собственной спецификации члена класса
Итак, приведенный ниже код должен компилироваться, и действительно, он
struct Foo{
Foo()
{
Bar bar; // Bar is fully visible here, even though it defined later
}
//void f(Bar){} // But NOT VISIBLE if used as a function parameter
struct Bar{};
};
int main()
{
Foo foo;
}
Однако, если я раскомментирую строку, которая определяет функцию-член void Foo::f(Bar)
, тогда код не скомпилируется с ошибкой
ошибка: "Бар" не был объявлен
Снова повторив стандарт, действительно кажется, что параметры функции не считаются местами, где класс считается полным. Однако это не имеет никакого смысла. Можете ли вы пролить свет, почему я не могу использовать Bar
в параметре функции (но в противном случае может полностью использовать его внутри функцию без каких-либо проблем) до ее полного определения?