C++:对象和外部函数的生命周期

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)

我的意思是,我正在使用一个尚未存在的对象调用外部函数.是不确定的行为?

相关问题:如果我将该检查函数作为成员函数(静态与否),该标准在构造函数之外但在类中使用非实时对象的说法是什么?

在一个类的观点和它的用户(一种在课堂上和在课堂外的生活中)之间的终身概念有什么不同?

Bar*_*rry 8

从[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中),所以我认为没有理由在终生的基础上排除前者.