C++ 为什么转换‘;浮动**’;至‘;常量浮点**’;?

C++ 为什么转换‘;浮动**’;至‘;常量浮点**’;?,c++,const-correctness,C++,Const Correctness,我有一个函数,它接收float**作为参数,我试图将其更改为接受const float** 编译器(g++)不喜欢它,并发布了: 从'float**'到'const float**'的转换无效。 这对我来说毫无意义,我知道(并验证)我可以将char*传递给接受const char*的函数,那么为什么不使用const float**?请参见 因为转换Foo**→ 常量Foo**将无效且危险。。。从Foo**→ const-Foo**的危险之处在于,它会让您在不使用强制转换的情况下悄悄地意外修改co

我有一个函数,它接收
float**
作为参数,我试图将其更改为接受
const float**

编译器(
g++
)不喜欢它,并发布了:

从'float**'到'const float**'的转换无效。

这对我来说毫无意义,我知道(并验证)我可以将
char*
传递给接受
const char*
的函数,那么为什么不使用
const float**

请参见

因为转换
Foo**
→ <代码>常量Foo**将无效且危险。。。从
Foo**
const-Foo**
的危险之处在于,它会让您在不使用强制转换的情况下悄悄地意外修改const-Foo对象


参考资料接着给出了一个示例,说明了这样一个隐式转换如何允许我在不使用强制转换的情况下修改
const
对象。

这是一个非常棘手的限制。它与语言的别名规则有关。看看标准是怎么说的,因为我以前曾经面对过这一点:

(第61页)

[注意:如果程序可以分配 类型为T**的指针指向类型为的指针 输入const T**(即,如果第//1行 下面是允许的),一个程序可以 无意中修改常量对象 (如第//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
}
-[完注]


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

因此,您不能将
浮点**
强制转换为
常量浮点**
,它将允许您在需要指向可变值的指针的位置存储指向常量的指针


<更多细节参见.< /p> < P>其他的ANWER已经详细说明了为什么这是C++中的错误。 让我谈谈你问题背后的问题。您希望在函数的接口中声明,函数不会修改数组中包含的浮点值。意图很好,并允许使用
const float**
数组调用函数。你问题背后的问题是,如何做到这一点而不解决丑陋的演员


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

星星之间的额外
const
可以确保编译器不会尝试在数组中存储指向const float的指针,因为这种类型声明指针值也是const


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

也许一个摘要会为您的答案添加更多内容。是的。const语法的规则是,如果它位于类型的左侧,它将紧密绑定到它右侧的对象,否则它将修改它左侧的对象。所以
const int
int const
是同一类型,
const int*
int const*
都是指向
int
的指针,也就是const,
int*const
是一个不能更改为
int
的指针,和
const int*const
int const*const
是您无法更改的指针。无限期扩展。“实现您想要的功能的正确方法是将函数参数的类型更改为const float*const*”这正是我想要的,这个答案应该更高。如果我调用一个带有签名的API
foo(const char**bar)
?我无法控制API,如何在函数调用中解决此错误?