Per*_*-lk 10 c++ constructor object-lifetime language-lawyer
假设我想调用我的对象的外部函数来在body构造函数中执行一些检查.由于对象的生命周期是在构造函数的主体完成执行时开始的,这是不安全的设计吗?
struct A;
void check(A const&) { /* */ }
struct A
{
A() { check(*this); }
};
Run Code Online (Sandbox Code Playgroud)
我的意思是,我正在使用一个尚未存在的对象调用外部函数.是不确定的行为?
相关问题:如果我将该检查函数作为成员函数(静态与否),该标准在构造函数之外但在类中使用非实时对象的说法是什么?
在一个类的观点和它的用户(一种在课堂上和在课堂外的生活中)之间的终身概念有什么不同?
从[base.life] A
开始check()
调用时,生命周期才会开始:
类型对象的生命周期从以下时间
T
开始:
- 获得具有适当对齐和类型大小的存储
T
,并且- 如果对象具有非空的初始化,则其初始化完成.
A
有非空的初始化.从[class.base.init]/13开始,它的初始化完成:
在非委托构造函数中,初始化按以下顺序进行:
- ...
- - 最后,执行构造函数体的复合语句.
然而,尽管还A
没有开始它的生命周期,标准另外提供,[class.base.init]/16:
可以为正在构造的对象调用成员函数(包括虚拟成员函数,10.3)...但是,如果这些操作是在ctor-initializer(或直接或间接从ctor-initializer直接调用的函数)中执行的基类的mem-initializers已经完成,操作的结果是未定义的.
关于终身问题,两者之间没有区别:
void check(const A& ) { .. }
struct A {
A() { check(*this); }
};
Run Code Online (Sandbox Code Playgroud)
和:
struct A {
void check() const { .. }
A() { check(); }
};
Run Code Online (Sandbox Code Playgroud)
明确允许后者(因为它不在ctor-initializer中),所以我认为没有理由在终生的基础上排除前者.