2017-01-26 3 views
2
int *b = new int(); 
const int *&a = b; 

Среда IDE показала «недопустимый инициализацию ссылки типа const int*& из выражения типа int*»C++: недействительны инициализация ссылки типа «сопзЬ Int * &» из выражения типа 'INT *

I не понимаю.

+1

Причина этого [поясняется здесь] (http://c-faq.com/ansi/constmismatch.html) с точки зрения указателей. Рассмотрим следующее: 'const int i = 0; int * p; const int * & z = & p; z = & i; '-' p' не может указывать на 'i'. Однако, если это преобразование разрешено, вы можете изменить 'p' через ссылку, чтобы указать на' i', и использовать это для изменения 'i'. – chris

ответ

2

Вы не можете связать ссылки с различными типами; для этого случая это int * и const int*.

Для const int *&a = b;, b является int*, а затем должен быть преобразован в const int* сначала. Здесь подразумевается неявное преобразование, но преобразованный const int* является временным и не может быть привязан к a; потому что это ссылка lvalue на не-const.

С другой стороны, temporary object может быть связан с именующей ссылкой на константную или RValue-ссылку, т.е.

const int * const &a = b; // fine, and the lifetime of the temporary is extended to match the lifetime of the reference a 

Обратите внимание на положение const, теперь a объявлен как именующая-ссылку на константный указатель to const int.

2
  • b является указатель на Int.
  • a является ссылкой на указатель на const int.

So b не может быть присвоен a.

Вы, вероятно, хотите ссылку на указатель на сопзЬ в целом вместо:

int *b = new int(); 
int *const &a = b; 
0

Проблема заключается в том, что эти два типа

int * 

и

const int * 

два различных типа. Таким образом, выражение в правой части, которое является переменной b, преобразуется в rvalue типа const int *.

Вы не можете связывать постоянную ссылку на rvalue. Таким образом, вы должны написать

const int * const &a = b; 
0

Формальной причиной является то, что int* и const int* различные типы, и преобразование создает временное, и вы не можете связать неконстантную ссылку на временный.

делает его ссылка на константный указатель будет работать:

const int * const &a = b; 

Для мотивирующего примера, давайте предположим, что это было разрешено:

int* p = nullptr; 
const int*& rp = p; 

rp и p Теперь относятся к одному объекту.

Давайте сделаем const int.

const int y = 1; 

Назначение const int* для const int* должны быть безопасными, не так ли ?.

rp = &y;   

Теперь, поскольку *p не сопзЬ, мы можем присвоить новое значение к нему:

*p = 0xbaad1dea; 

Но p тот же объект, как rp и *rp является y так *p также y , и y: const

и теперь мы находимся в стране неопределенного поведения.

Смежные вопросы