I'm trying to create a custom exception that derives from std::exception
and overrides what()
. At first, I wrote it like this:
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();
}
};
This works fine in VS2012, but it doesn't compile in GCC 4.8 with -std=c++11
:
error: looser throw specifier for ‘virtual const char* UserException::what() const’
So I add noexcept
:
virtual const char* what() const noexcept override
This works fine in GCC, but it doesn't compile in Visual Studio (because VS 2012 doesn't support noexcept
):
error C3646: 'noexcept' : unknown override specifier
What is the recommended way to deal with this? I want the same code to compile with both compilers and I'm using C++11 features, so I can't compile with different -std
.
Use a macro
#ifndef _MSC_VER
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif
And then define the function as
virtual const char* what() const NOEXCEPT override
You could also modify that to allow noexcept
on later versions of VS by checking the value of _MSC_VER
; for VS2012 the value is 1600.