Это похоже на проект C++11. стандартный, если мы посмотрим на раздел 5.2.3
Явное преобразование типов (функциональная нотация), параграф 2 говорит (выделено мной):
Выражение T(), где T – это спецификатор простого типа или спецификатор имени типа для полного типа объекта, не являющегося массивом, или типа void (возможно, с указанием cv), создает значение prvalue указанного типа, значение которого является результатом инициализации значения (8.5) объекта типа T; для случая void() инициализация не выполняется.[...]
формулировка очень похожа на pre C++11 также.
Это допустимо в constexpr, несмотря на то, что раздел 7.1.5
параграф 3
говорит:
Определение функции constexpr должно удовлетворять следующим ограничениям:
и включает в себя этот пункт:
его возвращаемый тип должен быть буквальным типом;
и void не является литералом в C++11 согласно разделу 3.9
параграфу 10, но если мы затем посмотрим на параграф 6, он выдаст исключение, которое подходит для этого случая, в нем говорится:
Если специализация экземпляра шаблона функции constexpr или функции-члена шаблона класса не удовлетворяет требованиям для функции constexpr или конструктора constexpr, эта специализация не является функцией constexpr или конструктором constexpr. [Примечание. Если функция является функцией-членом, она все равно будет константной, как описано ниже. —конец примечания] Если никакая специализация шаблона не дает функции constexpr или конструктора constexpr, программа плохо сформирована; диагностика не требуется.
Как Кейси отметил в черновик стандарта C++14 void — это литерал, это раздел 3.9
Типы параграф 10 гласит:
Тип является буквальным типом, если он:
и включает:
- пустота; или
09.12.2013