我有一个接收float**
作为参数的函数,我尝试将其更改为const float**
。
编译器(g++
)不喜欢它并发布:
invalid conversion from ‘float**’ to ‘const float**’
这对我来说没有任何意义,我知道(并且已经验证)我可以将char*
传递给需要const char*
的函数,为什么不使用const float**
?
答案 0 :(得分:22)
这是一个非常棘手的限制。它与语言的别名规则有关。看看标准说的是什么,因为我之前曾经遇到过这个问题:
(第61页)
[注意:如果程序可以分配一个 类型为T **的指针指针 类型const T **(即,如果行// 1 以下是允许的,一个程序可以 无意中修改了一个const对象 (因为它在第// 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 }
-end note]
答案 1 :(得分:20)
请参阅Why am I getting an error converting a Foo** → const Foo**?
因为转换
Foo**
→const Foo**
无效且危险...从Foo**
→const Foo**
进行转换是危险的,因为它会让您默默无闻意外修改const Foo对象而没有强制转换
该引用继续举例说明这种隐式转换如何允许我在没有强制转换的情况下修改const
对象。
答案 2 :(得分:10)
其他anwers已经详细说明了为什么这是C ++中的错误。
让我谈谈你的问题背后的问题。您希望在函数的接口中声明您的函数不会修改数组中包含的浮点值。很好的意图,并允许使用const float **
数组调用您的函数。你的问题背后的问题是,如何在不解决丑陋演员的情况下实现这一目标。
实现所需目标的正确方法是将函数参数的类型更改为const float * const *
。
星号之间的额外const
确保编译器您的方法不会尝试在数组中存储指向const float的指针,因为此类型声明指针值也是const。
现在,您可以使用float **
(问题中的示例),const float **
和const float * const *
参数调用此函数。
答案 3 :(得分:8)
如果您将参数转换为const float**
,则可以将const float*
存储在参数指向的内存位置。但是调用函数认为这个内存位置应该包含一个非const float*
,并且可能稍后尝试更改这个指向float
。
因此,您无法将float**
转换为const float**
,它将允许您在指向可变值的指针的位置存储指向常量的指针。
有关详细信息,请参阅C++ FAQ Lite。