gcc 4.9.1不符合标准? (标准:: runtime_error)

时间:2016-09-22 14:53:40

标签: c++ c++11 gcc4.9

我们希望自己定义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);
};

1 个答案:

答案 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&)方面实施,这会打破你所有的希望和愿望。 =)