2015-05-31 2 views
1

Я слышал, что в C++11 мы должны заменить throw с noexcept после объявления методы:переписывают бросок после функции с noexcept

В C++ 11, обычно следует использовать noexcept вместо этого. Старая спецификация броска устарела.

Как это сделать в следующем коде?

template <typename Object> 
class Stack 
{ 
public: 

    Stack(); 

    Object & peek() throw(std::runtime_error); 

}; 

Ссылка link

Пожалуйста, избегайте ссылок на вопросы, которые не работают на std::runtime_error

+0

Это не исключение. Просто удалите предложение throw или сделайте комментарий. – Yakk

+0

Возможный дубликат [Разница между C++ 03 throw() specifier C++ 11 noexcept] (http://stackoverflow.com/questions/12833241/difference-between -c03-throw-specifier-c11-noexcept) – m0nhawk

+0

@ m0nhawk Как эта ссылка связана с 'std :: runtime_error'? – barej

ответ

0

Было установлено, что динамические характеристики исключения не были действительно полезны, поэтому они были устаревшими в C++ 11. Единственным случаем, когда они считались полезными, были пустой динамическая спецификация исключения, то есть throw(). В этом случае в качестве лучшей альтернативы была представлена ​​декларация noexcept, позволяющая компилятору выполнять более агрессивные оптимизации. (Обратите внимание, что это означает, что throw() и noexcept являются не семантически эквивалентны, и вы должны только заменить бывший с ним, если вы знаете, что программа будет вести себя правильно.)

В вашем случае, вы не имеете пустой throw(), поэтому вы не можете заменить его noexcept. Широко признано, что в этом случае было бы лучше просто удалить throw(std::runtime_error) и упомянуть о том, что функция может выбросить std::runtime_error, но ничего больше в документации, поскольку Yakk уже предложил в комментариях.

Смежные вопросы