I'va seen an excersise in a book, but I cannot figure out the answer:
Is the following code legal or not? If not, how might you make it legal?
int null = 0, *p = null;
Of course, the second one is not legal, you cannot convert int to int*.
The theme was in the section the constexpr
.
GUYS! This is just an exercise about pointers, consts, and constexprs! I think, you have to solve it without cast and nullptr.
In C++11, a null pointer constant was defined as
an integral constant expression prvalue of integer type that evaluates to zero
(C++11 [conv.ptr] 4.10/1)
This means that adding constexpr
to the declaration actually makes null
a valid null pointer constant:
constexpr int null = 0, *p = null;
Note that this was considered a defect and changed in C++14, so that only an integer literal can be a null pointer constant:
A null pointer constant is an integer literal with value zero ...
(C++14 N4140 [conv.ptr] 4.10/1)
So, there is a way to make the initialisation legal using constexpr
in C++11, but its existence was considered a standard defect and removed in C++14. The book is therefore teaching outdated information.
Note that because this is a defect, compilers have generally backported this behaviour to their C++11 mode as well (if they even implemented the original one in the first place).
The other answer miss a very simple solution to make it legal: Make null
a pointer:
int *null = 0, *p = null;
But as noted, the best solution is to not use the null
variable at all, but to use the standard nullptr
.
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