2016-03-03 142 views
4

Here我發現:默認情況下繼承構造函數noexcept(true)嗎?

繼承構造[...]都是noexcept(真)默認情況下,除非他們需要調用一個函數是noexcept(假),在這種情況下,這些功能noexcept(假)。

這是否意味着在下面的例子中,繼承的構造是noexcept(true),儘管它在基類中被明確定義爲noexcept(false),或者被認爲是本身作爲一個函數,noexcept(假)被稱爲?

struct Base { 
    Base() noexcept(false) { } 
}; 

struct Derived: public Base { 
    using Base::Base; 
}; 

int main() { 
    Derived d; 
} 

回答

2

繼承的構造也將noexcept(false)因爲當你引用,除非他們需要調用一個函數,noexcept(假)

一個繼承的構造將是 noexcept(true)默認

當構造函數運行時Derived也會調用Base的構造函數,即noexcept(false),因此Derived構造函數也將是noexcept(false)

這由以下證明。

#include <iostream> 

struct Base { 
    Base() noexcept(false) { } 
}; 

struct Derived: public Base { 
    using Base::Base; 
}; 

int main() { 
    std::cout << noexcept(Derived()); 
} 

輸出0

+0

我認爲,在該網站上的文檔的一部分是被明確很遠......總之,這是有道理的。 – skypjack