This is the code:
const int x = 0;
const int& r = x;
const int* p1 = x; // Works (p1 = 0)
const int* p2 = r; // error C2440: 'initializing': cannot convert from 'const int' to 'const int *'
The third line should provoke an error. It doesn't in VS2015. It's a bug in that compiler. Other compilers do emit error messages about this line.
Until C++11, any integral constant expression that evaluates to 0 is treated as a null pointer constant, so the first line is equivalent to
const int* p1 = NULL;, It doesn't make p1 point to x.
Since C++11 (and VS2015 is supposed to support C++11) this is no longer the case. Roughly speaking, only literal zero and
nullptr are valid null pointer constants.
The fourth line was never valid in any version of C++, because the type of
r is a reference, not an integer.