int *b = new int();
const int *&a = b;
Среда IDE показала «недопустимый инициализацию ссылки типа const int*&
из выражения типа int*
»C++: недействительны инициализация ссылки типа «сопзЬ Int * &» из выражения типа 'INT *
I не понимаю.
int *b = new int();
const int *&a = b;
Среда IDE показала «недопустимый инициализацию ссылки типа const int*&
из выражения типа int*
»C++: недействительны инициализация ссылки типа «сопзЬ Int * &» из выражения типа 'INT *
I не понимаю.
Вы не можете связать ссылки с различными типами; для этого случая это 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.
b
является указатель на Int.a
является ссылкой на указатель на const int.So b
не может быть присвоен a
.
Вы, вероятно, хотите ссылку на указатель на сопзЬ в целом вместо:
int *b = new int();
int *const &a = b;
Проблема заключается в том, что эти два типа
int *
и
const int *
два различных типа. Таким образом, выражение в правой части, которое является переменной b
, преобразуется в rvalue
типа const int *
.
Вы не можете связывать постоянную ссылку на rvalue
. Таким образом, вы должны написать
const int * const &a = b;
Формальной причиной является то, что 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
и теперь мы находимся в стране неопределенного поведения.
Причина этого [поясняется здесь] (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