Почему я получаю ошибку при преобразовании ‘плавания **’ к ‘плаванию константы **’?

У меня есть функция, которая получает float** как аргумент, и я пытался изменить его для взятия const float**.

Компилятор (g++) не любил его и выпущенный:

invalid conversion from ‘float**’ to ‘const float**’

это не имеет никакого смысла мне, я знаю (и проверенный), что я могу передать char* к функции, которая берет const char*, итак, почему не с const float**?

29
задан Sinan Ünür 17 March 2010 в 15:34
поделиться

3 ответа

См. Почему я получаю сообщение об ошибке при преобразовании Foo ** → const Foo **?

Потому что преобразование Foo ** const Foo ** приведет к быть недействительным и опасным ... Причина, по которой преобразование из Foo ** const Foo ** опасно, состоит в том, что оно позволит вам незаметно и случайно изменить объект const Foo без cast

Далее в ссылке дается пример того, как такое неявное преобразование может позволить мне модифицировать объект const без приведения.

21
ответ дан 28 November 2019 в 01:17
поделиться

Это очень сложное ограничение. Это связано с правилами сглаживания языка. Взгляните на то, что говорят стандарты, потому что я сталкивался с этим однажды раньше:

(Страница 61)

[Примечание: если программа может назначить указатель типа T** на указатель введите const T** (то есть, если строка //1 ниже было разрешено), программа могла Непреднамеренное изменение объекта const (как это делается в строке //2). Для example,

int main() {
 const char c = 'c';
 уголь* шт;
 const char** pcc = &pc; //1: не допускается
 *pcc = &c;
 *pc = 'C'; 2: изменяет объект const
}

— концевая нота]

22
ответ дан 28 November 2019 в 01:17
поделиться

Если бы вы преобразовали параметр в const float**, то могли бы хранить const float* в той области памяти, на которую указывает параметр. Но вызывающая функция считает, что эта область памяти должна содержать неконстантный float*, и впоследствии может попытаться изменить этот указатель на float.

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

Более подробно см. в C++ FAQ Lite.

8
ответ дан 28 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: