Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between a null pointer constant (nullptr), a null pointer value and a null member pointer value?

In ISO/IEC 14882:2017 (C++17), Section 5.13.7 "Pointer literals" is stated:

5.13.7 Pointer literals [lex.nullptr]

pointer-literal: nullptr

1 The pointer literal is the keyword nullptr. It is a prvalue of type std::nullptr_t. [Note: std::nullptr_t is a distinct type that is neither a pointer type nor a pointer to member type; rather, a prvalue of this type is a null pointer constant and can be converted to a null pointer value or null member pointer value. See 7.11 and 7.12. —end note]

Following, nullptr is a prvalue of type std::nullptr_t. A prvalue of type std::nullptr_tis a null pointer constant; thus nullptr is a null pointer constant. A null pointer constant (so is nullptr) can be converted to a null pointer value or a null member pointer value.

Now I have in the cited Section 7.11, "Pointer conversions" of ISO/IEC 14882:2017:

A null pointer constant is an integer literal (5.13.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type.

I understand that a null pointer constant is an integer literal with a value of zero or a prvalue of type std::nullptr_t, but I do not understand the difference to the null pointer value nor the null member pointer value. I do not understand how the result of the conversion from a null pointer constant to a pointer type is a "null pointer value of that type" and what a null pointer value in that context is.

My Question is:

  • What is the difference between a null pointer constant (which is nullptr), a null pointer value and a null member pointer value?
like image 940
RobertS supports Monica Cellio Avatar asked Jan 30 '20 16:01

RobertS supports Monica Cellio


People also ask

What is the difference between null and nullptr?

NULL is 0 (zero) i.e. integer constant zero with C-style typecast to void* , while nullptr is prvalue of type nullptr_t , which is an integer literal that evaluates to zero.

What is a null pointer constant?

A null pointer constant is an integer constant expression that evaluates to zero. For example, a null pointer constant can be 0, 0L , or such an expression that can be cast to type (void *)0 .

Does null == nullptr?

In C++11 and beyond, a pointer that is ==NULL will also ==nullptr and vice versa. Uses of NULL other than comparing with a pointer (like using it to represent the nul byte at the end of a string) won't work with nullptr .

Is it better to use null or nullptr?

Putting it All Together As a reminder, since C++11, NULL can be either an integer literal with value zero, or a prvalue of type std::nullptr_t . Because of this ambiguity, I recommend switching exclusively to nullptr . nullptr will make your code less error-prone than relying on the implementation-defined NULL .


1 Answers

What is the difference between a null pointer constant (nullptr), a null pointer value and a null member pointer value?

Null pointer constant is either nullptr (or any other prvalue of type std::nullptr_t), or integer literal of value 0. Examples of null pointer constants:

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

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

Of these, don't use the integer literals nor NULL unless you need to support older than C++11 standard.

Null pointer value is the value of a pointer type that represents null. Examples of null pointer values:

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

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

Null member pointer value is the value of a member pointer type that represents null. Example of null member pointer values:

(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

Note that std::nullptr_t is not a pointer type nor a pointer to member type.

like image 142
eerorika Avatar answered Nov 15 '22 07:11

eerorika