Почему в std :: exception есть дополнительные конструкторы в VC ++? - PullRequest
24 голосов
/ 01 марта 2011

Что-то, что я заметил только сейчас.Определение 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();
};

Определение exception в MSDN :

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, тогда как стандартная версия позволяет вам делать это только для производных классов (но не мешает вам создавать универсальный exception снеопределенное сообщение).

Я знаю, что это довольно незначительно, но все же.Есть ли для этого веская причина?

Ответы [ 2 ]

19 голосов
/ 01 марта 2011

Не очень хорошая причина.Реализация MS решила поместить обработку строк в std :: exception вместо каждого производного от него класса ().

Поскольку они фактически также предоставляют интерфейс, требуемый стандартом, эторассматривается как соответствующее расширение.Программы, следующие стандарту, работают как положено.

Другие реализации не делают этого таким образом, поэтому переносимые программы не должны использовать дополнительные конструкторы.

0 голосов
/ 01 марта 2011

Хорошей идеей было избавиться от спецификации броска. Хотя они не должны бросать, спецификации броска, как правило, плохие.

Размещение расширений сделает код непереносимым, но, скорее всего, исправит проблемы с нарезкой, когда люди "ловят" исключение std :: по значению, и оно может скопировать строку локально из того, что копирует.

Я не вижу преимущества ни в int, ни в неявных конструкторах, которые принимают один параметр.

...