传递给 std::runtime_error 的 ctor 的字符串对象的生命周期是多少?

What's the life time of the string object passed into std::runtime_error's ctor?

根据cppreferencesexplicit runtime_error( const std::string& what_arg );不会复制what_arg的内容。

我可以安全地将临时字符串对象传递给 std::runtime_errorctor 吗?

例如:

std::string GetATempString(const char* msg)
{
    return { msg };
}

int main()
{
    try {
        throw std::runtime_error(GetATempString("Hello"));
    } catch (const std::runtime_error& e) 
    {
            e.what(); // Is it guaranteed that "Hello" would be returned safely?
    }
}

你误会了。 std::runtime_error 始终将字符串复制到引用计数的写时复制内部缓冲区中,因为稍后复制时可能不会抛出异常。