положение const для указателя или ссылки - PullRequest
0 голосов
/ 15 февраля 2019

Для простых типов положение const слева от * или & имеет те же эффекты.То есть:

const type *

эквивалентно

type const *

(так же и ссылка).Например:

const double pi = 3.14159;
const const double * pip1 = π
const double const * pip2 = π
const double & pir1 = pi;
double const & pir2 = pi;

pip1 и pip2, а также pir1 и pir2 одинаковы, и компилятор принимает их без ошибок.

Но ситуация меняется, когда дело доходит до более сложныхтипы.Для следующего кода:

const std::vector<std::string> vs(10);
const std::string * const & ppp = &vs[0];

, где тип const std::string *, я не могу записать определение ppp как

const const std::string * & ppp = &vw[0];

, поскольку компилятор выдает ошибку:

ошибка C2440: «инициализация»: невозможно преобразовать из «const std :: basic_string *» в «const std :: string * & '

Итак, мой вопрос: почему я не могу поставить const of & перед const * в этом случае?Я пытался добавить скобки, чтобы помочь работе компилятора, но только выдавал больше ошибок.Спасибо.

PS: я работаю над Visual Studio 2015 под Windows 10.

1 Ответ

0 голосов
/ 15 февраля 2019

Но ситуация меняется, когда дело касается более сложных типов

Нет, ситуация точно такая же.

const применяется слева, если толькотам ничего нет, и в этом случае это относится к праву.

У компилятора (или кого-либо еще) абсолютно нет возможности узнать, что вы имели в виду под const const std::string * & ppp.

Ваш примерconst const double * pip1 = &pi тоже недопустимо, а не компилируется с GCC ;если Visual Studio принимает его, это какое-то странное нестандартное расширение - чтобы понять его (и как использовать его в описанном вами случае), вам придется обратиться к документации Microsoft.Хотя было бы лучше избегать таких выходок.

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