Что именно noexcept охватывает для конструкторов?

согласно стандарту C++, что именно делает noexcept как noexcept-спецификация к конструктору класса применяется?

  1. the

2 ответов


другими словами, которые из вышеперечисленных охватываются noexcept как noexcept-спецификация...?

спецификация исключений (noexcept и динамическая спецификация исключений) относится к построению базовых классов, построению и инициализации членов и кода в теле конструктора. в основном, все функции, выполняемые при строительстве объекта - это имеет смысл в том, что спецификация исключения привязана к конструктору объекта, поэтому она должна охватывать код, выполняемый во время построения объекта; было бы нелогично, если бы какая-либо часть конструкции не была покрыта этим.

поддержка стандартных котировок...

что делать, если исключение создается во время строительства (и, возможно, не обрабатывается)?

[за исключением.spec] / 9

всякий раз, когда исключение типа E выбрасывается и выполняется поиск обработчика ([кроме.handle]) встречает внешний блок функции со спецификацией исключения, которая не позволяет E, потом

  • если определение функции имеет спецификацию динамического исключения, функция std::unexpected() называется ([только.неожиданно]),
  • в противном случае функция std::terminate() называется ([только.прекращать.)]

что значит "самый внешний блок функции" означает? тело функции.1

на спецификация исключений выше включает в себя как noexcept-спецификация.

как определяется неявно объявленная спецификация исключения для неявно объявленного конструктора?

[за исключением.spec] / 15

неявно объявленный специальный функция-член f какой класс X считается, что имеет неявную спецификацию исключения, которая состоит из всех членов из следующих наборов:

  • если f - это конструктор,

    • наборы потенциальных исключений вызовов конструктора

      • на Xнепараметрические нестатические члены данных,
      • на и
      • если X не является абстрактным ([class.аннотация]), для Xвиртуальные базовые классы,

        (включая выражения аргументов по умолчанию, используемые в таких вызовах), выбранные разрешением перегрузки для неявного определения f ([class.ctor])...

    • наборы потенциальных исключений инициализации нестатических членов данных из бандаж или равно инициализатор, что не проигнорировали ([класс.основа.init]);

это дает очень полезное разъяснение о том, что компилятор будет использовать для определения (и, следовательно, рассмотрения) спецификации исключения.


1что означает "самый внешний блок функции"? был высказан комментарий по поводу обеспокоенности определением блока функции. Стандарт не имеет формального определения блок функции. Фраза блок функция используется только в обработка исключений [за исключением]. Фраза была включена в стандарт еще с C++98.

для дальнейшей ясности по этому вопросу нам нужно будет найти альтернативный источник и сделать некоторые разумные выводы.

С Страуструп с++ глоссарий;

функции тела - самый внешний блок a функция. См. также: try-block, определение функции. TC++PL 2.7, 13.

и [dcl.fct.защита.общие]/1 грамматика для


вы, вероятно, можете ответить на этот вопрос самостоятельно, если вы считаете noexcept конструктор определение которых не доступны в текущей единице трансляции (например, внедрение конструктора находится в общей библиотеке).

если noexcept не относится ко всему конструктору, исключение все равно может быть каким-то образом выдано конструктором, победив цель noexcept.

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