В чем разница между константой нулевого указателя (nullptr), значением нулевого указателя и значением указателя нулевого элемента? - PullRequest
6 голосов
/ 30 января 2020

В ISO / IEC 14882: 2017 (C ++ 17) в разделе 5.13.7 «Литералы указателя» указано:

5.13.7 Литералы указателя [lex. nullptr]

pointer-literal: nullptr

1 Литералом указателя является ключевое слово nullptr. Это значение типа std :: nullptr_t . [Примечание: std :: nullptr_t - это отдельный тип, который не является ни типом указателя, ни указателем на тип члена; скорее, значение этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение указателя нулевого элемента . Смотри 7.11 и 7.12. - конец примечания]

После этого nullptr является prvalue типа std::nullptr_t. Значение типа std::nullptr_t является константой нулевого указателя; таким образом nullptr является константой нулевого указателя. Константа нулевого указателя (то есть nullptr) может быть преобразована в значение нулевого указателя или значение указателя нулевого элемента.

Теперь я имею в цитируемом разделе 7.11 «Преобразование указателя» ISO / IEC 14882: 2017:

Константа нулевого указателя является целочисленным литералом (5.13.2) со значением ноль или значением типа std :: nullptr_t. Константа нулевого указателя может быть преобразована в тип указателя; результатом является значение нулевого указателя этого типа , которое отличается от любого другого значения указателя объекта или типа указателя на функцию.

Я понимаю, что константа нулевого указателя является целым числом литерал со значением ноль или значением типа std::nullptr_t, но я не понимаю разницы между значением нулевого указателя или значением указателя нулевого элемента. Я не понимаю, как результатом преобразования константы с нулевым указателем в тип указателя является «значение нулевого указателя этого типа» и каково значение нулевого указателя в этом контексте.

Мой вопрос:

  • В чем разница между константой нулевого указателя (равной nullptr), значением нулевого указателя и значением указателя нулевого элемента?

1 Ответ

8 голосов
/ 30 января 2020

В чем разница между константой нулевого указателя (nullptr), значением нулевого указателя и значением указателя нулевого элемента?

Константа нулевого указателя - это либо nullptr (либо любое другое значение) типа std::nullptr_t) или целочисленный литерал значения 0. Примеры констант нулевого указателя:

NULL  // a macro for one of the others
0
0L
nullptr

std::nullptr_t fun();
fun() // also a null pointer constant

Из них не используйте целочисленные литералы или NULL, если вам не требуется поддержка более старых чем стандарт C ++ 11.

Значение нулевого указателя - это значение типа указателя, которое представляет собой нулевое значение. Примеры значений нулевого указателя:

(void*)nullptr     // pointer to void
(int*)nullptr      // pointer to object

using void_fun = void();
(void_fun*)nullptr // pointer to function

Значение указателя нулевого элемента - это значение типа указателя элемента, представляющего нулевое значение. Пример значений указателя нулевого элемента:

(int some_class::*)nullptr // pointer to data member

using mem_void_fun_ptr = void(some_class::*)(); // unfortunately cannot alias member
                                                // function type as far as I know,
                                                // so we alias pointer to it instead
(mem_void_fun_ptr)nullptr  // pointer to member function

Обратите внимание, что std::nullptr_t не является ни типом указателя, ни указателем на тип элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...