Разъяснение относительно ссылки на указатель - PullRequest
0 голосов
/ 17 января 2019

Я пытался передать ссылку на указатели , в основном два случая:

  1. const int* &ref_var - ref_var - ссылка на указатель на постоянное целое число.
  2. int *const &ref_var - ref_var - ссылка на постоянный указатель на целое число.

Теперь второй случай работает нормально, так как я не могу изменить сам указатель, но в 1-м случае я получаю сообщение об ошибке, которого, как мне кажется, не должно быть, поскольку переменная неконстантная может передаваться в качестве аргумента функции с константой указателем в качестве параметра.

Код:

#include<iostream>

using std::cout;
using std::endl;

void fun(const int* &ref_var)  //error: invalid initialization of reference of type const int*& from expression of type int*
{
     //BLANK
}

int main()
{
    int x=9;
    int *p=&x;     //ERROR VANISHES IF P IS DECLARED AS POINTER TO CONSTANT INT         
    fun(p);
    return 0; 
}

Где, когда функция fun объявляется как:

void fun(const int *ptr)
{
     //BLANK
}

Работает нормально, несмотря на то, что переданный аргумент является неконстантным указателем на int.

Не могли бы вы сказать мне, где я иду не так.

1 Ответ

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

Это два разных типа, и указатель на int не является указателем на const int. Да, указатель на int может быть приведен к указателю на const int.

Проблема здесь в том, что существует дополнительный уровень косвенности, ссылка. Итак, у вас есть ссылка на int*. Цель отличается от ссылки на const int*.

Это похоже на char*, получение указателя на него и попытку передать его в const char**. Он также потерпит неудачу, потому что внутренние типы различны.

И да, это может раздражать. Единственный вариант - установить правильный тип перед получением ссылки на него, поэтому p должно быть const int*.

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