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