2016-05-17 43 views
1

爲什麼我不能讓運算符++()不成立?運算符++()nothrow不編譯

這可能是使用後綴++運算符(通過前綴++運算符)的少數優點之一。

例如,此代碼不能編譯

class Number 
{ 
public: 
    Number& operator++()  // ++ prefix 
    { 
     ++m_c; 
     return *this; 
    } 

    Number operator++ (int) nothrow // postfix ++ 
    { 
     Number result(*this); // make a copy for result 
     ++(*this);    // Now use the prefix version to do the work 
     return result;   // return the copy (the old) value. 
    } 

    int m_c; 
}; 

在一個側面說明它的後綴運算符還可以由線程安全的。

+1

有沒有原因你沒有聲明前綴運算符'nothrow'?這將有助於瞭解編譯器在抱怨什麼,但我認爲它可能很簡單,因爲當您使用非'nothrow'前綴運算符來實現它時,'nothrow'後綴操作符會抱怨。 – ShadowRanger

+0

@ShadowRanger:就是這樣。 'nothrow'函數不能調用潛在的拋出函數。 –

+0

在VC 2015中,我得到:錯誤C3646:'nothrow':未知覆蓋說明符 – Damian

回答

6

nothrow是一個常量,用於傳遞給operator new以指示new不應該在出錯時拋出異常。

我想你想要的是noexcept

+0

有點奇怪,爲什麼我們需要C++中的兩個關鍵字,它們看起來與我相似。 – Damian

+0

@Damian'nothrow'在C++中不是關鍵字,它是'std :: nothrow_t'類型的常量。 –

+0

技術上nothrow不是關鍵字。這是std命名空間中的一個常量。但我同意,這是令人困惑的(即使你的問題的評論者感到困惑)。 – zdan