在标准库中,异常类构造函数的参数类型,例如
std::runtime_error
,遵循以下模式:
runtime_error( const std::string& what_arg ); // (1)
runtime_error( const char* what_arg ); // (2)
runtime_error( const runtime_error& other ); // (3)
让我困惑的是(1)使用
const std::string&
而不是
std::string
,这显然会导致构造函数内部的额外复制操作。
如果参数类型为
std::string
,它不仅可以避免额外的复制操作,而且还可以
noexcept
;这是我最近意识到的结论:
如果功能标记为
没有例外
有一个参数的类型可能会在构造过程中引发异常,那么即使保证会引发异常,也不会导致程序因异常而终止。
这一点已得到证实
the test program
.
那么,为什么标准库异常构造函数参数列表不使用
std::string
或者,我的理解和结论以及测试程序是否不正确,甚至是一种未定义的行为?