Пустота как литеральный тип?
В С++ 14 void
является литеральным типом
Тип - это буквальный тип, если он:
- void; или
- скалярный тип; или
- ссылочный тип; или
- массив литералов; или
- тип класса (раздел 9), который обладает всеми следующими свойствами: он имеет тривиальный деструктор,
- это совокупный тип (8.5.1) или имеет хотя бы один constexpr шаблон конструктора или конструктора, который не является копией или перемещением конструктор и
- все его нестатические элементы данных и базовые классы имеют нелетучие литералы.
В С++ 11 void
не является литеральным типом
Тип - это буквальный тип, если он:
- скалярный тип; или
- ссылочный тип, относящийся к типу литерала; или
- массив литералов; или
- тип класса (раздел 9), который обладает всеми следующими свойствами: он имеет тривиальный деструктор,
- каждый вызов конструктора и полное выражение в логические или несимметричные инициализаторы для нестатических элементов данных (если они есть) являются постоянное выражение (5.19),
- это совокупный тип (8.5.1) или имеет хотя бы один constexpr шаблон конструктора или конструктора, который не является копией или перемещением конструктор и
- все его нестатические элементы данных и базовые классы имеют буквальный типы.
Итак, почему void
литеральный тип? Какие преимущества он предлагает?
Ответы
Ответ 1
Так как void
literal type
, функции constexpr
могут иметь тип возврата void
в С++ 14.
В нем описано это предложение.
Цитата из предложения:
Разрешен произвольный оператор выражения, чтобы разрешить обращается к функциям, выполняющим проверки, и разрешать assert-like строит. void также становится литеральным типом, поэтому constexpr функции, которые существуют только для выполнения таких проверок, могут возвращать void.
#define ASSERT(expr) \
(void)((expr) || assert_failed(#expr, __LINE__, __FILE__))
void assert_failed(...); // not constexpr
struct S {
std::array a<int, 100>;
size_t i;
constexpr void check_invariants() const {
ASSERT(i < a.size());
ASSERT(a[i] == 0);
}
S(std::array<int, 100> a_, size_t i_) : a(a_), i(i_) {
check_invariants();
}
};