C / C ++转换为const古怪

时间:2011-03-23 16:16:35

标签: c++ c casting const

我有一个声明为:

的函数
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?我正在将一个浮动**转换为const float **。可能出现什么问题? :/

编辑:谢谢你非常快速的回复! :)

4 个答案:

答案 0 :(得分:8)

请在C ++常见问题解答中阅读"Why am I getting an error converting a Foo** → Foo const**?"

答案 1 :(得分:2)

看起来很奇怪,它实际上可以减少某些模糊情况下的const正确性,允许你间接修改const对象。

有关详细信息,请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17

您可以做的是将Foo**转换为Foo const* const*,因为这不会让任何后门打开。

答案 2 :(得分:1)

只是为大多数有效的答案添加一个重要的观察结果:C和C ++的情况有所不同。虽然这个技巧在C ++中使用Foo const* const*,但这在C中不起作用,它不接受这个并发出警告。

如果你想对Foo const* const*进行类型安全演员,你必须采用更复杂的方法。

答案 3 :(得分:0)

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