C++ 在异常消息中使用constexpr

C++ 在异常消息中使用constexpr,c++,c++11,exception,c++14,constexpr,C++,C++11,Exception,C++14,Constexpr,我试图在异常消息中使用constexpr,但这不起作用: 下面的代码在g++上编译得很好(使用c++11或c++14) #包括 constexpr auto TEST=“TEST”; 类测试抛出:公共标准::异常{ 公众: 虚拟常量char*what()常量throw(){ return(std::string(“THROW”)+TEST).c_str(); } }; int main() { 投掷测试{}; } 我想知道为什么我的异常会输出一条空消息,好吧,这看起来是个坏把戏,但我不明白消

我试图在异常消息中使用constexpr,但这不起作用: 下面的代码在g++上编译得很好(使用c++11或c++14)

#包括
constexpr auto TEST=“TEST”;
类测试抛出:公共标准::异常{
公众:
虚拟常量char*what()常量throw(){
return(std::string(“THROW”)+TEST).c_str();
}
};
int main()
{
投掷测试{};
} 
我想知道为什么我的异常会输出一条空消息,好吧,这看起来是个坏把戏,但我不明白消息怎么会是空的


有没有一种方法可以在不使用宏替换constexpr的情况下实现这一点

灾难正在等待-以下是gcc的警告:

<source>: In member function 'virtual const char* test_throw::what() const':
9 : <source>:9:51: warning: function returns address of local variable [-Wreturn-local-addr]
         return (std::string("THROW ")+TEST).c_str();
选项3-重新发明车轮

class test_throw : public std::exception 
{
    std::string message_;

public:
    test_throw()
    : message_ { std::string("THROW ") + TEST }
    {}

    const char* what() const noexcept
    {
        return message_.c_str();
    }
};

灾难在等待——以下是gcc的警告:

<source>: In member function 'virtual const char* test_throw::what() const':
9 : <source>:9:51: warning: function returns address of local variable [-Wreturn-local-addr]
         return (std::string("THROW ")+TEST).c_str();
选项3-重新发明车轮

class test_throw : public std::exception 
{
    std::string message_;

public:
    test_throw()
    : message_ { std::string("THROW ") + TEST }
    {}

    const char* what() const noexcept
    {
        return message_.c_str();
    }
};

小心点,你的指针晃来晃去。好的,现在就拿。谢谢你,巴里。有没有办法实现我想做的事?你想做什么?我觉得你问的是解决方案中的一个障碍,而不是你的问题。在构造时或使用可变成员时,将字符串存储在类的成员中。小心,指针悬空。好的,现在获取它。谢谢你,巴里。有没有办法实现我想做的事?你想做什么?我觉得您询问的是解决方案中的一个障碍,而不是您的问题。请在构造时或使用可变成员将字符串存储在类的成员中。
class test_throw : public std::exception 
{
    std::string message_;

public:
    test_throw()
    : message_ { std::string("THROW ") + TEST }
    {}

    const char* what() const noexcept
    {
        return message_.c_str();
    }
};