2015-06-24 50 views
0

我有類似下面的類:顯示爲什麼std :: is_nothrow_move_assignable取決於析構函數的存在?

class C { 
public: 
    C() : ... {} 
    ~C() {} 

    Member_1 m_1; 
    // ... 
    Member_N m_N; 
}; 

兩個特殊的成員函數聲明爲唯一的。

現在,

static_assert(std::is_nothrow_move_assignable<Member_1>::value); 
// ... 
static_assert(std::is_nothrow_move_assignable<Member_N>::value); 

都滿意。然而,

static_assert(std::is_nothrow_move_assignable<C>::value); 

斷言。如果我刪除空的析構函數,它會通過。

析構函數與移動賦值運算符有什麼關係?新的五項規則?

編譯器是GCC 4.9.3和-std=c++0x(出於歷史原因)。

+0

標記析構函數爲no。 – Jarod42

+1

@ Jarod42:析構函數是隱含的,但不包括 –

+2

這可能是相關的:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 56191? (或簡單地http://stackoverflow.com/questions/15721544/destructors-and-noexcept其中指向那裏) –

回答

5

用戶聲明的析構函數禁止隱式生成移動特殊成員函數([class.copy]/p9,20)。因此,C只有一個拷貝構造函數和一個拷貝賦值操作符;後者被用來執行「移動」任務,並且可能會拋出。

相關問題