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

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

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

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

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

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

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

Из cppreference синтаксис explicit-specifier(optional) template-name ( parameter-declaration-clause ) -> simple-template-id ;; нет noexcept ...

Jarod42 09.04.2021 18:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Итак, clang / gcc / msvc неверны здесь: - /

Jarod42 09.04.2021 18:16

Итак, грубо говоря, все основные компиляторы ошибаются? Потому что это правда, что его игнорируют, но они принимают это, даже если стандарт явно говорит, что токена там не должно быть.

skypjack 09.04.2021 18:17

@ Jarod42 Думаю, что да. Для них имеет смысл разрешить это, поскольку это легко игнорировать, и это не имеет никакого отношения к тому, что происходит.

NathanOliver 09.04.2021 18:18

Что ж, это имеет смысл, но технически это недействительный код.

skypjack 09.04.2021 18:19

@skypjack Ага. Это чертовски менее вопиющее, чем принятие GCC по умолчанию VLA.

NathanOliver 09.04.2021 18:20

Справедливо. :)

skypjack 09.04.2021 18:21

Итак, на практике отсутствие исключений конструктора заимствовано из основного определения, также в случае руководств по дедукции?

skypjack 09.04.2021 18:23

@skypjack Руководству по выводам это совершенно не нужно. Все, что он используется, - это определение параметров шаблона. Как только это будет сделано, разрешение перегрузки запускается снова, чтобы фактически выбрать конструктор.

NathanOliver 09.04.2021 18:27

TIL. На самом деле это имеет смысл. Спасибо за быстрый ответ и дальнейшие объяснения.

skypjack 09.04.2021 18:28

@skypjack Пожалуйста. Если у вас есть час, вы должны дать этот разговор часы. Он раскрывает множество мелких деталей и действительно хорошо объясняет все. ИМХО Стефан Т. Лававей проделал большую работу.

NathanOliver 09.04.2021 18:31

Я обязательно это сделаю. Спасибо, что указали на это.

skypjack 09.04.2021 18:35

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