[英]Why an inline declaration is not an incomplete type?
请考虑以下代码:
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
节[class.mem] :
在类说明符的结束时,类被认为是完全定义的对象类型(3.9)(或完整类型)。 在类成员规范中,该类在函数体 ,缺省参数,引入继承构造函数(12.9)的使用声明,异常规范和非静态数据成员的括号或等于初始化器中被视为完整 (包括嵌套类中的这类东西)。 否则,它在其自己的类成员规范中被视为不完整
这意味着你甚至不必转发声明Bar
( 现场直播 ):
struct Foo {
Foo()
{
Bar bar;
}
struct Bar {};
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.