Это продолжение этого вопроса.
В комментариях и в ответе сказано несколько раз, что void{}
не является допустимым идентификатором типа или действительным выражением.
Это было прекрасно, это имело смысл, и это было все.
Затем я прошел через [7.1.7.4.1/2] (вычитание типа заполнителя) рабочего проекта.
Там сказано, что:
[...]
- для не отбрасываемого оператораreturn
, который встречается в функции, объявленной с типом возврата, который содержит тип заполнителя,T
- объявленный тип возвращаемого значения, аe
- операнд оператораreturn
. Если операторreturn
не имеет операнда, тоe
естьvoid{}
; [...]
Итак, void{}
(концептуально) законно или нет?
Если это приемлемо, как указано в рабочем проекте (хотя и только как выражение, как если бы оно было), оно должно быть законным. Это означает, что decltype(void{})
также должен быть действительным.
В противном случае, если рабочий проект использует void()
вместо void{}
?
Ну, честно говоря, я совершенно уверен, что я недостаточно квалифицирован, чтобы указать на ошибку в рабочем проекте, поэтому реальный вопрос: что не так в моих рассуждениях?
Что именно void{}
, упомянутое в вышеприведенной марке и почему это юридическое выражение в этом случае?