【发布时间】:2015-12-17 13:38:55
【问题描述】:
考虑下面的代码:
struct Foo {
struct Bar;
Foo()
{
Bar bar; // Why isn't Bar an incomplete type?!
}
struct Bar {}; // Full definition
};
// struct Bar {}; // fails to compile due to incomplete type
int main()
{
Foo foo;
}
它在至少 2 个编译器(gcc5.2、clang3.5)下编译得很好。我的问题是:
- 为什么
Bar在构造函数Foo::Foo中不被视为不完整类型,因为我在构造函数上方将其前向声明但在构造函数内部完全使用它?
每当我将Foo::Bar 移出班级,换句话说Bar 成为一个独立班级时,我都会得到预期的
错误:聚合 'Foo::Bar bar' 的类型不完整,无法定义
【问题讨论】:
-
成员函数体的行为就好像它们是在外线定义的(即,在类定义之后)。
-
主要原因是编译器在确定如何处理每种类型时,可以对类内的所有定义进行本地搜索。范围被全面检查,因为它只是程序的一小部分,它不需要依赖源代码中的声明顺序。
标签: c++ incomplete-type