C / C ++ приведение к странности - PullRequest
3 голосов
/ 23 марта 2011

У меня есть функция, объявленная как:

int myFunction(const float** ppArr, const int n, const int m);

, и когда я вызываю ее так:

float** ppArr = new float*[5];
// Some initialization of ppArr

int result = myFunction(ppArr, 5, 128);  <<<< Error

и ошибка (VS 2008 Express):

error C2664: 'Test_myFunction.cpp' : cannot convert parameter 1 from 'float **' to 'const float **'

WTF?Я бросаю поплавок **, чтобы создать поплавок **.Что может пойти не так с этим?: /

Редактировать: Спасибо за невероятно быстрые ответы !!!:)

Ответы [ 4 ]

8 голосов
/ 23 марта 2011
2 голосов
/ 23 марта 2011

Как ни странно, в некоторых непонятных случаях это может на самом деле снизить корректность констант, позволяя косвенно изменять объект констант.

Для получения полной информации см. http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17.

Что вы можете сделать, так это конвертировать Foo** в Foo const* const*, так как это не оставляет открытых задних дверей.

1 голос
/ 23 марта 2011

Просто добавлю важное замечание к наиболее верным ответам: вещи разные для C и C ++.Хотя трюк работает в C ++ с Foo const* const*, это не работает в C, он не примет это и не выдаст предупреждение.

В C вам придется пойти более сложными путями, если вы хотитеиметь типизированное приведение к Foo const* const*.

0 голосов
/ 23 марта 2011

float** не может быть преобразовано в const float**.

Его можно преобразовать в float* const* и const float* const*.Вот так:

void f(float* const* p) {}

void h(const float* const* p) {}

int main() {
    float** p= new float*[5];
    f(p);
    h(p);
}

Скомпилируйте его с помощью GCC: http://ideone.com/RrIXl

...