Почему C++ может преобразовать int* в const int*, но с ** так же не может?

95
16 июня 2021, 03:00

Есть такой код (ничего не делает, приведён просто для примера):

#include <iostream>
using namespace std;
int f(const int *)
{
    return 0;
}
int main() 
{
    int * x = new int;
    f(x);
    getchar();
    return 0;
}

Здесь (в коде выше) всё работает.

Но в таком коде:

#include <iostream>
using namespace std;
int f(const int **) // Добавил ещё одну *
{
    return 0;
}
int main() 
{
    int * x = new int;
    f(&x); // Теперь передаю адрес указателя
    getchar();
    return 0;
}

Visual Studio выдаёт ошибку:

"int f(const int **)": невозможно преобразовать аргумент 1 из "int**" в "const int **"

Не пойму, в чём принципиальная разница между int* и int**. Почему одно преобразовывается без проблем, а другое нет?

Answer 1

Это сделано для избегания потенциального неявного присвоения исходному указателю указателя на неизменяемый объект минуя const_cast:

int const val{};
int * p_val;
p_val = &val; // не прокатывает
int const * * pp_val{&p_val}; // предположим что эта строка работает
*pp_val = &val; // исходный указатель теперь тоже указывает на неизменяемый объект val
*p_val = 42;

Чтобы заработал исходный пример достаточно будет добавить еще один const квалификатор.

int f(int const * const *)

Преобразование int * * в int const * const * будет разрешено так как оно не создает описанную выше проблему:

int const * const * pp_val{&p_val}; // работает
*pp_val = &val; // не прокатывает
READ ALSO
Не подключается Jquery к Bitrix 1C

Не подключается Jquery к Bitrix 1C

Подскажите , не могу ни как понять , почему не вешается JQuery на BitrixЗалил css, оно подключилось как надо, заливаю JS Он не хочет подключаться

93
Тире между цифрами в регулярном выражении, шаблон ввода

Тире между цифрами в регулярном выражении, шаблон ввода

Подскажите, пожалуйста, по регуляркам

89
пустая строка в таблице html

пустая строка в таблице html

Как сделать одну строку в таблице html пустой, чтобы она была в качестве разделителя?

168
C++/CLI не находит библиотеку DLL, основанной на C#.NET

C++/CLI не находит библиотеку DLL, основанной на C#.NET

В общем, написал я следующий код в CLI_out на C# (NET 4

102