为什么std :: exception在VC++中有额外的构造函数?

sus*_*att 24 c++ standards visual-c++

我刚才注意到的事情.定义exception标准(18.6.1):

class exception {
public :
    exception() throw();
    exception(const exception &) throw();
    exception& operator=(const exception&) throw();
    virtual ~exception() throw();
    virtual const char* what() const throw();
};
Run Code Online (Sandbox Code Playgroud)

exceptionMSDN中的定义:

class exception {
public:
   exception(); 
   exception(const char *const&);
   exception(const char *const&, int);
   exception(const exception&); 
   exception& operator=(const exception&); 
   virtual ~exception();
   virtual const char *what() const;
};
Run Code Online (Sandbox Code Playgroud)

看起来Microsoft的版本允许您为exception对象指定错误消息,而标准版本只允许您为派生类执行此操作(但不会阻止您exception使用未定义的消息创建泛型).

我知道这是非常微不足道的,但仍然存在.有这么好的理由吗?

Bo *_*son 19

没有任何好的理由.MS实现选择将字符串处理放在std :: exception中,而不是在从它派生的每个类中(<stdexcept>).

由于它们实际上也提供了标准所要求的接口,因此可以将其视为符合标准的扩展.符合标准的程序按预期工作.

其他实现不这样做,因此可移植程序不应使用额外的构造函数.

  • @Steve:可以检测到它们,但我也相信允许实现添加额外的构造函数.确保标准(17.4.4.4)说实现可以添加非虚拟成员函数.它没有明确说明这包括**特殊**成员函数,但也不排除它们.在这种特殊情况下,我会使它们受到保护,因为它是派生类的实现细节. (3认同)