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

时间:2011-03-01 16:20:32

标签: c++ visual-c++ standards

我刚才注意到的事情。 the standard(18.6.1)中exception的定义:

class exception {
public :
    exception() throw();
    exception(const exception &) throw();
    exception& operator=(const exception&) throw();
    virtual ~exception() throw();
    virtual const char* what() const throw();
};

MSDNexception的定义:

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;
};

似乎Microsoft的版本允许您为exception对象指定错误消息,而标准版本只允许您为派生类执行此操作(但不会阻止您创建泛型{带有未定义消息的{1}}。

我知道这非常微不足道,但仍然如此。这有充分的理由吗?

2 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:0)

摆脱抛出规范是一个好主意。虽然他们不应该扔,但抛出规格通常是不好的。

放入扩展会使代码变得不可移植,但可能会修复切片问题,人们通过值“捕获”std :: exception,并且可以从本地复制字符串中复制字符串。

我没有看到int中的优势,也没有看到带有一个参数的非显式构造函数。