[英]C++: lifetime of an object and external functions
假設我想調用我的對象的外部函數來在body構造函數中執行一些檢查。 由於對象的生命周期在構造函數的主體完成執行時開始,它是不安全的設計嗎?
struct A;
void check(A const&) { /* */ }
struct A
{
A() { check(*this); }
};
我的意思是,我正在使用一個尚未存在的對象調用外部函數。 是不確定的行為?
相關問題:如果我將該檢查函數作為成員函數(靜態與否),該標准在構造函數之外但在類中使用非實時對象的內容是什么?
在一個類的觀點和它的用戶(一種在課堂上和在課堂外的生活中)之間的終身概念有什么不同?
調用check()
時, A
的生命周期不會開始,因為來自[base.life]:
類型
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); }
};
和:
struct A {
void check() const { .. }
A() { check(); }
};
明確允許后者(因為它不在ctor-initializer中 ),所以我認為沒有理由在終生的基礎上排除前者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.