簡體   English   中英

C ++:對象和外部函數的生命周期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM