如何在Visual Studio中处理noexcept

我试图创建一个派生自std::exception的自定义std::exception并重写what() 。 起初,我是这样写的:

class UserException : public std::exception
{
private:
    const std::string message;
public:
    UserException(const std::string &message)
        : message(message)
    {}

    virtual const char* what() const override
    {
        return message.c_str();
    }
};

这在VS2012中工作正常,但它不能在GCC 4.8中用-std=c++11编译:

错误:宽松抛出说明符'虚拟常量字符* UserException ::什么()const'

所以我加了noexcept

virtual const char* what() const noexcept override

这在GCC中工作正常,但在Visual Studio中不能编译(因为VS 2012不支持noexcept ):

错误C3646:'noexcept':未知覆盖说明符

建议如何处理这个问题? 我想要使​​用这两种编译器编译相同的代码,并且我使用C ++ 11功能,因此我无法使用不同的-std编译。


使用宏

#ifndef _MSC_VER
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif

然后将函数定义为

virtual const char* what() const NOEXCEPT override

你也可以修改,以允许noexcept上通过检查的价值更高版本VS的_MSC_VER ; 对于VS2012,其值为1600。


自从Visual Studio 2015以来,仅支持“noexcept”(如此处所述:https://msdn.microsoft.com/en-us/library/wfa0edys.aspx)。 我在Visual Studio 2013中使用了以下代码(从以上示例中导出):

#if !defined(HAS_NOEXCEPT)
#if defined(__clang__)
#if __has_feature(cxx_noexcept)
#define HAS_NOEXCEPT
#endif
#else
#if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || 
    defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026
#define HAS_NOEXCEPT
#endif
#endif

#ifdef HAS_NOEXCEPT
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif

此检查可以查看是否支持noexcept

// Is noexcept supported?
#if defined(__clang__) && __has_feature(cxx_noexcept) || 
    defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || 
    defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180021114
#  define NOEXCEPT noexcept
#else
#  define NOEXCEPT
#endif

以上与Clang,GCC和MSVC一起工作。

链接地址: http://www.djcxy.com/p/27923.html

上一篇: How to deal with noexcept in Visual Studio

下一篇: Using wxString with Google Mock