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

Почему nullptr_t не является ключевым словом

Вот объявление nullptr_t в <cstddef>:

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

В соответствии с этим, std::nullptr_t является псевдонимом для некоторого неопределенного фундаментального типа, который nullptr является экземпляром. Таким образом, фактический тип nullptr не имеет имени (ну, язык не дает ему имя, имя дано стандартной библиотекой).

nullptr сам по себе является ключевым словом. Но стандарт не вводил ключевое слово для типа nullptr. Вместо этого предлагается decltype(nullptr).

Каковы причины для этого? Я нашел это довольно запутанным. Вам нужно включить заголовок и указать std:: только для использования встроенной функции языка.

Является ли это тем, что набор ключевых слов на С++ как можно меньше? Является ли это специально для nullptr, или комитет собирается объявить все новые типы, подобные этому, поэтому у нас было бы namespace std { typedef decltype(false) bool; }, если бы такое решение было принято раньше?

4b9b3361

Ответ 1

Согласно первоначальному предложению nullptr, N2431 (Emphasis Mine):

Мы предлагаем новое стандартное зарезервированное слово nullptr. Ключевое слово nullptrобозначает постоянное значение r типа decltype(nullptr). Мы также укажите typedef: typedef decltype(nullptr) nullptr_t; nullptr_t. не зарезервированное слово. Это typedef (как указывает его _t typedef) для decltype(nullptr), определенном в <cstddef>. Мы не ожидаем многого прямое использование nullptr_t в реальных программах.

Как правило, комитет неохотно добавляет новые ключевые слова на этом языке. По моему скромному мнению, это по уважительной причине, названо обратная совместимость.

Если вы еще прочтете это предложение, вы поймете, что основная проблема заключается не в нарушении существующего кода.

Представьте, какой эффект мог бы иметь, если бы комитет теперь и снова вводил новое ключевое слово. Все ад сломался бы, и С++ из истории успеха был бы большой шуткой.

Ответ 2

Я считаю, что причина проста: комитет по стандартизации хочет избежать столь же разумного возможного внедрения новых ключевых слов (потому что, учитывая миллиардные строки существующего кода на С++, он может конфликтовать с каким-то кодом где-то).

Так как std::nullptr_t является определяемым, ему не нужно быть ключевым словом.

И bool - это ключевое слово по историческим причинам. Это, скорее всего, было введено довольно рано...

С++ в основном относится к унаследованному программному обеспечению, поэтому человеческие и социальные и экономические соображения (и обратная совместимость) имеют большое значение для комитета по стандартизации (чаще всего по техническим причинам).

Ответ 3

Добавление новых ключевых слов исключается, если это не необходимо. Зачем добавлять что-то к языку, когда его можно просто добавить в библиотеку.

У вас уже есть аналогичная вещь с sizeof(x), которая возвращает std::size_t, которая также должна содержать заголовок, чтобы получить typedef для.