Почему я получаю ошибку при преобразовании "float**" в " const float**"?
у меня есть функция, которая получает float** в качестве аргумента, и я попытался изменить его, чтобы взять const float**.
компилятор (g++) не понравилось и выдал:
invalid conversion from ‘float**’ to ‘const float**’
это не имеет смысла для меня, я знаю (и проверено), что я могу пройти char* функции, которая принимает const char*, так почему бы не с const float**?
4 ответов
посмотреть почему я получаю ошибку при преобразовании Foo * * → const Foo**?
потому что преобразование
Foo**→const Foo**будет недействительным и опасным ... Причина преобразования изFoo**→const Foo**опасно то, что это позволит вам тихо и случайно изменить объект const Foo без приведения
ссылка далее дает пример того, как такое неявное преобразование может позволить мне изменить const объект без гипса.
это очень сложное ограничение. Это связано с правилами псевдонимов языка. Взгляните на то, что говорят стандарты, потому что я уже сталкивался с этим однажды:
(стр. 61)
[Примечание: если программа может назначить указатель типа T** к указателю введите const T** (то есть, если строка / / 1 ниже было разрешено), программа может ненароком изменить объект const (как это делается в line / / 2). Для пример,
int main() { const char c = 'c'; char* pc; const char** pcc = &pc; //1: not allowed *pcc = &c; *pc = 'C'; //2: modifies a const object }-конец Примечание]
другие anwers подробно объяснили, почему это ошибка в C++.
позвольте мне обратиться к вопросу, стоящему за вашим вопросом. Вы хотели заявить в интерфейсе своей функции, что ваша функция не будет изменять значения float, содержащиеся в массиве. Хорошее намерение и позволяет вызывать вашу функцию с помощью const float ** массивы. Вопрос за вашим вопросом будет заключаться в том, как достичь этого, не разрешая уродливые слепки.
правильный путь достигнуть чего вы хотела изменить тип параметра функции const float * const *.
дополнительные const между звездами гарантирует компилятору, что ваш метод не будет пытаться хранить указатели на const float в массиве, так как этот тип объявляет, что значения указателей также const.
теперь вы можете вызвать эту функцию с помощью float ** (который был примером в вашем вопросе), const float ** и const float * const * аргументов.
если вы преобразовали параметр в const float** затем вы можете сохранить const float* в месте памяти, на которое указывает параметр. Но вызывающая функция думает, что это место памяти должно содержать неконст float* и может позже попытаться изменить это указывает на float.
поэтому вы не можете бросить float** до const float**, Это позволит вам хранить указатели на константы в местах, где ожидается указатели на изменяемые значения.
для более подробно см. C++ FAQ Lite.