Третья строка должна вызывать ошибку. Это не в VS2015, потому что если ошибка в компиляторе или в стандарте, в зависимости от того, какой стандарт применяется. Другие компиляторы выдают сообщения об ошибках в этой строке.
Перед C++ 11, любой интегральная константа, которая вычисляется в 0 рассматриваются как постоянный нулевого указателя, поэтому первая линия эквивалентна const int* p1 = NULL;
, он не делает точку p1 к й.
С C++ 14 это уже не так. Грубо говоря, только буквальный ноль и nullptr
являются действительными константами указателя на указатель.
Между тем, то есть в C++ 11, стандарт фактически допускает постоянные выражения, которые оцениваются в ноль, которые рассматриваются как константы нулевого указателя. Это считается дефектом стандарта. Он был исправлен в C++ 14. Некоторые компиляторы (gcc, clang) сразу же исправляют дефект и сообщают об ошибке даже в режиме C++ 11. VS2015 нет.
Четвертая строка никогда не была действительной ни в одной из версий C++, потому что тип r
является ссылкой, а не целым числом.
'cosnt int * p1 = x;' даже не компилировать. Какой компилятор вы используете? – Rakete1111
Ваша первая попытка с 'p1' также не является законной. Обе инициализации указателя неверны. –
VS 2015 с/W4,/sdl и/WX on. Он не компилируется, если x не const, но компилируется с константой. – lousybyte