The following code (taken from here):
int* ptr = int();
compiles in Visual C++ and value-initializes the pointer.
How is that possible? I mean int()
yields an object of type int
and I can't assign an int
to a pointer.
How is the code above not illegal?
int()
is a constant expression with a value of 0, so it's a valid way of producing a null pointer constant. Ultimately, it's just a slightly different way of saying int *ptr = NULL;
Because int()
yields 0
, which is interchangeable with NULL
. NULL
itself is defined as 0
, unlike C's NULL
which is (void *) 0
.
Note that this would be an error:
int* ptr = int(5);
and this will still work:
int* ptr = int(0);
0
is a special constant value and as such it can be treated as a pointer value. Constant expressions that yield 0
, such as 1 - 1
are as well allowed as null-pointer constants.
The expression int()
evaluates to a constant default-initialized integer, which is the value 0. That value is special: it is used to initialize a pointer to the NULL state.
From n3290 (C++03 uses similar text), 4.10 Pointer conversions [conv.ptr] paragraph 1 (the emphasis is mine):
1 A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to 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. Such a conversion is called a null pointer conversion. [...]
int()
is such an integral constant expression prvalue of integer type that evaluates to zero (that's a mouthful!), and thus can be used to initialize a pointer type. As you can see, 0
is not the only integral expression that is special cased.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With