Рассмотрим следующий код:
std::string my_error_string = "Some error message";
// ...
throw std::runtime_error(std::string("Error: ") + my_error_string);
Строка, переданная в runtime_error, является временным значением, возвращаемым строкой operator+
. Предположим, что это исключение обрабатывается примерно так:
catch (const std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
Когда уничтожается временное значение, возвращаемое operator+
строки? В спецификации языка есть что сказать по этому поводу? Также предположим, что runtime_error принял аргумент const char*
и был выдан следующим образом:
// Suppose runtime_error has the constructor runtime_error(const char* message)
throw std::runtime_error((std::string("Error: ") + my_error_string).c_str());
Теперь, когда временная строка, возвращаемая оператором +, уничтожается? Будет ли он уничтожен до того, как блок catch попытается его распечатать, и поэтому runtime_error принимает std :: string, а не const char *?