我们希望自己定义std::runtime_error:runtime_error(const string& arg)
。我们根据其他构造函数实现这样的构造函数,即std::runtime_error:runtime_error(const char*)
,如:
namespace std {
runtime_error::runtime_error(const string& arg)
: runtime_error(arg.c_str()) {
...
}
}
使用gcc-4.9.1,这是不可能的,因为构造函数std::runtime_error::runtime_error(const string& arg)
不存在。在 gcc / 4.9.1 / include / c ++ / 4.9.1 / stdexcept 中,我们看到以下内容:
...
class runtime_error : public exception
{
string _M_msg;
public:
/** Takes a character string describing the error. */
explicit
runtime_error(const string& __arg);
virtual ~runtime_error() _GLIBCXX_USE_NOEXCEPT;
/** Returns a C-style character string describing the general cause of
* the current error (the same string passed to the ctor). */
virtual const char*
what() const _GLIBCXX_USE_NOEXCEPT;
};
...
标准明确指出应该有一个明确的runtime_error(const char*)
构造函数。
19.2.6类runtime_error [runtime.error]
namespace std {
class runtime_error : public exception {
public:
explicit runtime_error(const string& what_arg);
explicit runtime_error(const char* what_arg);
};
答案 0 :(得分:1)
也许这不能回答你原来的问题,但是如果真的要截取runtime_error
实例,你可以这样做(假设使用了gcc):
namespace std {
runtime_error::runtime_error(const string& arg)
#if (__GNUC__ > 4)
: runtime_error(arg.c_str())
#else
: _M_msg(arg)
#endif
{
// intercept here!
}
}
希望调用的runtime_error(const char*)
将来不会在runtime_error(const string&)
方面实施,这会打破你所有的希望和愿望。 =)