Проблемы с int * & x - PullRequest
       2

Проблемы с int * & x

0 голосов
/ 14 января 2019

У меня проблема с указателями разыменования

int x = 12;
int* y = &x;
int* &a = y;//This does work
int* &b = &x;//This does not work

Не y и &x содержат одинаковые значения / одно и то же значение. Может кто-нибудь сказать мне, что на самом деле представляет int*& a.

Редактирование: 1 Извините, я не понимал, что такой простой код даст два разных результата в c и в c++. В c эта строка int*& a = y просто ошибка. Однако в c++ код выдает ошибку, как я показал.

Edit: 2

int *&a = y; //compiles in g++ 7.3.0 ubuntu, but not in gcc 7.3.0

int *&b = &x; //it simply throws error in g++ and gcc

Ответы [ 2 ]

0 голосов
/ 14 января 2019

В C нет понятия ссылки, поэтому 3-я и 4-я строки не будут работать в C.

3-я строка - правильный код C ++.

4-я строка недопустима, потому что когда вы берете адрес x с помощью &x, вы создаете значение r int*. Вы не можете привязать rvalue к ссылке lvalue (в данном случае &b). Ссылка lvalue должна быть привязана к lvalue (что и делает ваша третья строка). Вы можете назначить значение rvalue переменной rvalue, привязать его к const lvalue reference или привязать его к ссылке rvalue (начиная с C ++ 11):

int* b = &x;  //assign rvalue to a variable
int* const &b = &x; //bind rvalue to const lvalue reference
int* &&b = &x; //bind rvalue to rvalue reference
0 голосов
/ 14 января 2019

В опубликованном вами коде &x является значением r, поэтому, если вы хотите захватить ссылку на него, вы должны захватить его с помощью константной ссылки.

Что вам нужно, это int* const& b = &x.

Правило, которое я выучил, которое до сих пор хорошо мне помогает, - это читать декларацию справа налево, чтобы понять constness . В этом случае вы читаете что-то вроде « b - это ссылка на константный указатель на int ».

Ссылки должны ссылаться на переменные (то есть именованный экземпляр типа). Const ссылки могут ссылаться на временные объекты / безымянные переменные. Э.Г.

int x = 5; // x is a named instance of an int
int* p = &x;
int*& y = p; // the reference y is referring to the named variable p which is a pointer to an int.
int*& z = &x; // not ok because x is a named variable but "&x" is not, so a reference cannot refer to it.
int* const& w = &x; // ok because w is a const reference, not a reference.

Надеюсь, это поможет. Потратьте некоторое время онлайн, читая о ссылках и правильности const, и это все гель. Здесь есть много замечательных вопросов и ответов по этим двум темам.


Это хорошая статья, в которой обсуждаются lvalues ​​и rvalues: Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...