Подтвердить что ты не робот

С++ 11 noexcept классификатор и встроенные методы

Предоставляет ли С++ 11 какие-либо гарантии о функциях или методах inline при вызове других функций, объявленных с помощью квалификатора 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; }

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

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

4b9b3361

Ответ 1

Извините, нет. Единственные неявные спецификации исключений -

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

[Обратите внимание, что для функций дезактивации неявная спецификация исключений всегда выглядит как noexcept(true). Для специальных функций-членов, которые неявно объявлены или явно дефолтны, неявная спецификация исключений может быть либо noexcept(true) либо noexcept(false), как определено из спецификаций исключения соответствующих специальных функций-членов любых базовых классов и членов тип класса.]

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

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