Подтвердить что ты не робот

Пустота как литеральный тип?

В С++ 14 void является литеральным типом

Тип - это буквальный тип, если он:

- void; или

- скалярный тип; или

- ссылочный тип; или

- массив литералов; или

- тип класса (раздел 9), который обладает всеми следующими свойствами: он имеет тривиальный деструктор,

- это совокупный тип (8.5.1) или имеет хотя бы один constexpr шаблон конструктора или конструктора, который не является копией или перемещением конструктор и

- все его нестатические элементы данных и базовые классы имеют нелетучие литералы.

В С++ 11 void не является литеральным типом

Тип - это буквальный тип, если он:

- скалярный тип; или

- ссылочный тип, относящийся к типу литерала; или

- массив литералов; или

- тип класса (раздел 9), который обладает всеми следующими свойствами: он имеет тривиальный деструктор,

- каждый вызов конструктора и полное выражение в логические или несимметричные инициализаторы для нестатических элементов данных (если они есть) являются постоянное выражение (5.19),

- это совокупный тип (8.5.1) или имеет хотя бы один constexpr шаблон конструктора или конструктора, который не является копией или перемещением конструктор и

- все его нестатические элементы данных и базовые классы имеют буквальный типы.

Итак, почему void литеральный тип? Какие преимущества он предлагает?

4b9b3361

Ответ 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();
  }
};