Требуются ли в руководствах по дедукции спецификаторы noexcept?

По некоторым причинам я всегда думал, что руководства по дедукции должны иметь одинаковую -ность конструктора, на который они ссылаются. Например:

      template<typename T>
struct clazz {
    clazz(const T &) noexcept {}
};

clazz(const char &) noexcept -> clazz<int>;

То есть, если конструктор есть и я хочу, чтобы он был таким же и для const char &, я также должен добавить спецификатор в руководство по выводу.

Сегодня я немного поработал с ICC и обнаружил, что у него есть проблемы с дедукциями. Все идет нормально. Думал баг компилятора и все тут.
Однако я пошел изучать стандарт и не смог найти ни одного пункта, подтверждающего мое первоначальное предположение. Из-за этого я проверил то же самое на clang, и даже если он работает без проблем, кажется, что руководство по дедукции игнорируется в 100% случаев. С другой стороны, тот, что в конструкторе, влияет на оба.

Итак, мой вопрос в том, имеет ли это какой-либо смысл или требуется несколько распространить (если это вообще имеет смысл) -ness конструктора также на руководство по дедукции или это бесполезно, и я могу просто избавиться от всех noexceptпо дедуктивным направляющим?

1 ответ

Грамматика для руководства по дедукции определена в [temp.deduct.guide]/1 как

      explicit-specifier(opt) template-name ( parameter-declaration-clause ) -> simple-template-id ;

и, как вы можете видеть, он не включает спецификатор исключения.

Это имеет смысл. Руководство по дедукции на самом деле ничего не строит. Он просто используется, чтобы сообщить компилятору, как получить параметры шаблона из набора аргументов. У вас есть двухэтапный процесс: руководство по дедукции проходит через разрешение перегрузки для определения параметров шаблона, а затем перечисляются конструкторы с этими выведенными параметрами шаблона, и разрешение перегрузки запускается для конструкторов.

Другие вопросы по тегам