2016-05-17 13 views
1

演算子++()をnothrowにできないのはなぜですか?演算子++()nothrowがコンパイルされない

これは、接頭辞++演算子(接頭辞++演算子よりも)を使用した場合のいくつかの利点の1つです。

例えば、このコードは側

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'を宣言していない理由はありますか?コンパイラが何を不平にしているのか知るのに役立つでしょうが、 'notrow'プレフィックス演算子を使用してそれを実装するときに不快な後置演算子が不平を言ってしまうことが簡単に分かります。 – ShadowRanger

+0

@ShadowRanger:それはまさにそれです。 'nothrow'関数は投げられる可能性のある関数を呼び出すことはできません。 –

+0

VC 2015でエラーC3646: 'nothrow':不明なオーバーライド指定子 – Damian

答えて

6

nothrowは、newがエラー時に例外をスローしないようにnew演算子に渡すために使用される定数です。

あなたが望むのはnoexceptだと思います。

+0

C++で2つのキーワードが必要な理由はちょっと似ています。 – Damian

+0

@Damian 'nothrow'はC++のキーワードではなく、' std :: nothrow_t'型の定数です。 –

+0

技術的にnothrowはキーワードではありません。これは標準の名前空間では定数です。しかし、私は同意する、それは混乱している(あなたの質問のコメント者さえ混乱していた)。 – zdan

関連する問題