2016-05-17 62 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