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