2012-08-15 15 views
10

Предоставляет ли C++ 11 какие-либо гарантии относительно функций или методов inline, когда они совершают вызовы для других функций, объявленных с помощью классификатора noexcept?C++ 11 noexcept классификатор и встроенные методы

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

Я предполагаю, что оптимизирующий компилятор будет свободно реализовать метод инлайн без полного EH и стек разматывания, согласно noexcept квалификации. Я хотел бы также ожидать, что это для простого метода доступа тоже:

... inline operator const char *() const { return m_buffer; } 

Хотя этот пример выглядит тривиальным, исключение гарантирует от того, когда они используются для реализации других классов или функций. Вопрос: Имеет ли стандартный код C++ 11 эти или следующие встроенные методы: noexcept? Или лучше опустить noexcept, если не требуется в соответствии со спецификацией класса или функции?

Редактировать: Во избежание недоразумений: noexcept неявный для встроенного метода?

+1

Для кода, предоставленного пользователем, 'noexcept' является только неявным для деструкторов, как простой ответ. –

+2

следующий вопрос: ** следует ли объявлять 'noexcept', когда это возможно? ** – Walter

ответ

8

Извините, нет. Единственными неявными исключениями являются:

  • О деструкторах.
  • О других неявно объявленных или явно дефолтных специальных функциях-членах: конструкторы по умолчанию, копировать и перемещать конструкторы, а также копировать и перемещать присваивание, если они не объявлены в определении класса, или объявлены с помощью = default;.
  • О функциях освобождения: operator delete и operator delete[].

Таким образом, с заявлением примера noexcept(static_cast<const char*>(std::declval<const MyString>())) должно быть false. Идите дальше и напишите noexcept, где это может иметь значение.

Конечно, как вы отметили, оптимизация компилятора по-прежнему позволяет заметить, что встроенная функция не может генерировать исключения и упрощать обработку исключений в вызывающем.

+1

В списке * implicit' noexcept' * вам не хватает деструкторов, которые используются объявленными/определенными, неявно 'noexcept', если только пользователь предоставил другую спецификацию исключения. Это отклонение C++ 11 от поведения C++ 03. То есть пользователь объявляет деструктор, как 'T :: ~ T() {throw 1; } 'будет прервать программу, даже если никакое другое исключение не будет активным (обратите внимание на отсутствие спецификации исключения) –

+0

Я пропустил это при сканировании стандарта, спасибо. – aschepler

+1

Также пропущено в исходном ответе: явно установленные по умолчанию специальные члены действуют так же, как если бы они были неявно объявлены. – aschepler

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