From clause 8.5.3 / 2 of the C ++ 11 standard:
A link cannot be changed to refer to another object after initialization. Please note that link initialization is treated very differently than assignment to it. Passing the argument (5.2.2) and the value of the return function (6.6.3) are initializations .
, . f3() , :
char c = 'a';
char* x = &c;
const char*& y = x;
, y, - const char*, , (.. x), char*. , , , ( , )), .
const const char* , , : char const char*, .
, const char* char* :
"cv1 T1" "cv2 T2" "cv1 T1" "cv2 T2" , T1 - , T2, T1 T2. "cv1 T1" - "cv2 T2" , T1 T2, cv1 cv-, cv-, cv2. [...]
, f2() , , :
char c = 'a';
char* x = &c;
char* const& y = x;
char* const, ( const char*) - char* , * ( const ).
, 8.5.3/5:
"cv1 T1" "cv2 T2" :
- lvalue
- lvalue ( ), "cv1 T1" - "cv2 T2,"
[...]
. char* const char* , ( f2() ). , const char* char* -, ( f3() ).