簡體   English   中英

編譯器為類生成noexcept ctor,而成員沒有這樣的保證

[英]Compiler generated noexcept ctor for class with members constructed with no such guarantee

考慮一個例子:

class ClassThatMayThrowInCtor
{
     ClassThatMayThrowInCtor()
     {
          if (g_unlucky) throw "Exception";
     }
};

class Aggregate
{
     ClassThatMayThrowInCtor m_member;
};

據我所知,在某些情況下,C ++ 14中的編譯器可能會生成一個默認的ctor noexcept

是在這種情況下,還是會理解,由於成員的默認ctor不提供任何此類保證,因此也不應該這樣做嗎?


當要求參考上述聲明( 在某些情況下... )時,我未能在標准中找到它,但是Andrzej的博客確實提到:

這並不意味着noexcept是沒有用的。 編譯器將使用noexcept適當地注釋類的隱式生成的成員函數(構造函數,復制和移動分配以及析構函數),並且STL組件將查詢該注釋。 該功能將啟用重大優化(通過使用move構造函數),即使您不會看到單個noexcept關鍵字。 而且, 當編譯器使用 noexcept 注釋函數時, 它會 正確地 執行它 (析構函數除外),因此不存在某些noexcept move構造函數將拋出的風險。

(強調我的)

來自[except.spec]

14-[...]如果f是[...]隱式聲明的默認構造函數[...] f允許所有異常,如果它直接調用的任何函數允許所有異常,並且f具有異常規范 noexcept(true)如果它直接調用的每個函數都不允許有異常。 [...]

隱式聲明的Aggregate默認構造函數直接調用ClassThatMayThrowInCtor::ClassThatMayThrowInCtor() ,它允許所有異常,因此Aggregate::Aggregate()允許所有異常,並且不是noexcept

您可以在編譯時檢查。 B的默認構造noexcept在下面的程序中不是noexcept

struct A {
    A() {
        throw 0;
    }
};

struct B {
    A a;
};

static_assert(noexcept(B{}), "");

int main() {
    return 0;   
}

該程序無法編譯,因為static_assert失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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