【发布时间】:2015-08-01 17:27:36
【问题描述】:
假设我想调用对象的外部函数来在主体构造函数中执行一些检查。由于对象的生命周期从构造函数的主体完成执行开始,这是一个不安全的设计吗?
struct A;
void check(A const&) { /* */ }
struct A
{
A() { check(*this); }
};
我的意思是,我正在调用一个尚未激活的对象的外部函数。是未定义的行为吗?
相关问题:如果我将该检查函数作为成员函数(静态或非静态),标准对在构造函数外部但在类内部使用非活跃对象有何规定?
在类和它的用户的观点之间的生命周期概念有什么不同(一种类内与类外的生命周期)?
【问题讨论】:
-
C++ FAQ 有相关信息。
-
应该没问题,只要函数不是virtual的成员并且不在初始化列表中
-
一个 const& 是一个引用,在检查开始时既不初始化也不在函数结束时销毁。除了在构造函数内部,对象是完全构造的。我在这段代码中没有看到任何问题
-
@JesseGood 我读过这个问题,还有这个问题:isocpp.org/wiki/faq/ctors#init-methods。所以,isocpp FAQ 是在 C++11 时代之前,我知道关于对象生命周期的规则在新标准中已经改变。虽然非常有用,但我希望对规则保持安全。
-
@RobK 符合标准。我正在向外部函数发送一个定义明确(对象已初始化)但非活动的对象。这样做的正式后果是什么?以后怎么跟儿子解释呢? :)
标签: c++ constructor language-lawyer object-lifetime