Xét đoạn mã sau:Tiêu hủy temporaries chuỗi trong trường hợp ngoại lệ ném
std::string my_error_string = "Some error message";
// ...
throw std::runtime_error(std::string("Error: ") + my_error_string);
Chuỗi truyền cho runtime_error là một tạm thời được trả về bởi chuỗi của operator+
. Giả sử ngoại lệ này được xử lý như sau:
catch (const std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
Khi nào thì trả về tạm thời bằng chuỗi operator+
bị hủy? Liệu các spec ngôn ngữ có bất cứ điều gì để nói về điều này? Ngoài ra, giả sử runtime_error nhận một đối số const char*
và được ném như sau:
// Suppose runtime_error has the constructor runtime_error(const char* message)
throw std::runtime_error((std::string("Error: ") + my_error_string).c_str());
Bây giờ khi nào chuỗi tạm thời trả về bởi toán tử + bị hủy? Nó sẽ bị phá hủy trước khi khối catch cố gắng in nó, và đó là lý do tại sao runtime_error chấp nhận một chuỗi std :: và không phải là một const char *?
Nitpick: 'std :: runtime_error (" Lỗi: "+ my_error_string);' là tốt bởi vì 'my_error_string' là loại chuỗi. Bạn không cần phải gọi một cách rõ ràng hàm tạo 'std :: string' trên' "Lỗi:" 'và làm lộn xộn mã của bạn. –
Tôi muốn 'std :: string (" Error: ") .append (my_error_string)' –