如何在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