为什么我将'float**'转换为'const float**'时出错?

Omr*_*dan 29 c++ const-correctness

我有一个函数float**作为参数接收,我试图改变它采取const float**.

编译器(g++)不喜欢它并发出:

invalid conversion from ‘float**’ to ‘const float**’

这对我没有意义,我知道(并且已经验证)我可以传递char*给一个需要的函数,const char*为什么不用const float**

Ara*_*raK 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
}
Run Code Online (Sandbox Code Playgroud)

- 尾注]


Sea*_*ean 21

请参阅为什么我在转换Foo**→const Foo**时出错?

因为转换Foo**const Foo**将是无效且危险的......转换来自Foo**const Foo**是危险的原因是它会让你在没有强制转换的情况下默默地和无意地修改const Foo对象

引用继续给出一个示例,说明这种隐式转换如何允许我在const没有强制转换的情况下修改对象.

  • 也许摘要会为您的答案增加更多内容. (3认同)

小智 12

其他anwers已经详细说明了为什么这是C++中的错误.

让我谈谈你的问题背后的问题.您希望在函数的接口中声明您的函数不会修改数组中包含的浮点值.很好的意图,并使您的函数可以使用const float **数组调用.你的问题背后的问题是,如何在不解决丑陋演员的情况下实现这一目标.

实现所需目标的正确方法是将函数参数的类型更改为const float * const *.

const星星之间的附加信息确保编译器您的方法不会尝试在数组中存储指向const float的指针,因为此类型声明指针值也是const.

您现在可以调用此函数float **(这是您的问题中的示例)const float **,和const float * const *参数.


sth*_*sth 8

如果将参数转换为const float**可以,则可以将a const float*存储在参数指向的内存位置.但是调用函数认为这个内存位置应该包含一个非const,float*并且可能稍后尝试更改这个指向的内容float.

因此,您无法将a转换float**为a const float**,它将允许您在指向可变值的指针的位置存储指向常量的指针.

有关更多详细信息,请参阅C++ FAQ Lite.