考虑下面的代码:
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++ 标准草案部分9.2
[类.mem]:
类被认为是完全定义的对象类型(3.9)(或
完整类型)位于类说明符的结束 } 处。内
类成员规范,类被认为是完整的
功能机构,默认参数,使用声明引入
继承构造函数 (12.9)、异常规范和
非静态数据成员的大括号或等于初始化器(包括
嵌套类中的此类事情)。否则视为不完整
在其自己的类成员规范内
这意味着您甚至不必转发声明Bar
(现场观看 http://melpon.org/wandbox/permlink/LwUlYn675n2f7Zvb):
struct Foo {
Foo()
{
Bar bar;
}
struct Bar {};
};
前向声明可能有助于避免违反章节3.3.7 第 2 段和第 3 段 https://stackoverflow.com/a/26682543/1708801.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)