我刚才注意到的事情。 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();
};
MSDN中exception
的定义:
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}}。
我知道这非常微不足道,但仍然如此。这有充分的理由吗?
答案 0 :(得分:19)
没有任何理由。 MS实现选择将字符串处理放在std :: exception中,而不是从它派生的每个类中(< stdexcept>)。
由于它们实际上也提供了标准所需的接口,因此可以将其视为符合标准的扩展。符合标准的程序按预期工作。
其他实现不这样做,因此可移植程序不应使用额外的构造函数。
答案 1 :(得分:0)
摆脱抛出规范是一个好主意。虽然他们不应该扔,但抛出规格通常是不好的。
放入扩展会使代码变得不可移植,但可能会修复切片问题,人们通过值“捕获”std :: exception,并且可以从本地复制字符串中复制字符串。
我没有看到int中的优势,也没有看到带有一个参数的非显式构造函数。