У меня есть функция, которая получает float**
как аргумент, и я пытался изменить его для взятия const float**
.
Компилятор (g++
) не любил его и выпущенный:
invalid conversion from ‘float**’ to ‘const float**’
это не имеет никакого смысла мне, я знаю (и проверенный), что я могу передать char*
к функции, которая берет const char*
, итак, почему не с const float**
?
См. Почему я получаю сообщение об ошибке при преобразовании Foo ** → const Foo **?
Потому что преобразование
Foo **
→const Foo **
приведет к быть недействительным и опасным ... Причина, по которой преобразование изFoo **
→const Foo **
опасно, состоит в том, что оно позволит вам незаметно и случайно изменить объект const Foo без cast
Далее в ссылке дается пример того, как такое неявное преобразование может позволить мне модифицировать объект const
без приведения.
Это очень сложное ограничение. Это связано с правилами сглаживания языка. Взгляните на то, что говорят стандарты, потому что я сталкивался с этим однажды раньше:
(Страница 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 }
— концевая нота]
Если бы вы преобразовали параметр в const float**
, то могли бы хранить const float*
в той области памяти, на которую указывает параметр. Но вызывающая функция считает, что эта область памяти должна содержать неконстантный float*
, и впоследствии может попытаться изменить этот указатель на float
.
Поэтому нельзя приводить float**
к const float**
, это позволило бы хранить указатели на константы в местах, где ожидаются указатели на изменяемые значения.
Более подробно см. в C++ FAQ Lite.