为啥将“float**”转换为“const float**”时出现错误?

Posted

技术标签:

【中文标题】为啥将“float**”转换为“const float**”时出现错误?【英文标题】:Why am I getting an error converting a ‘float**’ to ‘const float**’?为什么将“float**”转换为“const float**”时出现错误? 【发布时间】:2010-03-17 15:19:18 【问题描述】:

我有一个接收float** 作为参数的函数,我尝试将其更改为采用const float**

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

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

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

【问题讨论】:

【参考方案1】:

见Why am I getting an error converting a Foo** → const Foo**?

因为转换 Foo**const Foo** 将是无效和危险的......从Foo**const Foo** 的转换很危险的原因是它会让你默默地和意外地修改一个没有演员表

该参考继续举例说明这种隐式转换如何允许我修改 const 对象而无需强制转换。

【讨论】:

也许一个总结会增加你的答案。【参考方案2】:

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

(第 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

——尾注]

【讨论】:

【参考方案3】:

其他回答详细说明了为什么这是 C++ 中的错误。

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

实现您想要的正确方法是将函数参数的类型更改为const float * const *

星号之间的额外const 向编译器保证您的方法不会尝试将指向 const float 的指针存储在数组中,因为这种类型声明指针值也是 const。

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

【讨论】:

是的。 const 语法的规则是,如果它在一个类型的左边,它会紧紧地绑定到它右边的东西,否则它会修改它左边的东西。所以const intint const 是同一种类型,const int*int const* 都是指向int 即const 的指针,int* const 是你不能更改为int 的指针,你可以, 和 const int* constint const* const 是你不能改变的指针到你不能改变的ints。无限期延长。 "实现您想要的正确方法是将函数参数的类型更改为 const float * const *。"正是我想要的,这个答案应该更高。 如果我调用带有签名foo(const char** bar) 的API 怎么办?我无法控制API,如何解决函数调用中的这个错误?【参考方案4】:

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

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

更多详情请见C++ FAQ Lite。

【讨论】:

以上是关于为啥将“float**”转换为“const float**”时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Pandas 将我的 numpy float32 强制转换为 float64?

Go:为啥从 float64 转换为 float32 并返回会导致值发生变化? [复制]

为啥我会从“double”转换为“float”,可能会丢失数据警告?(c)

为啥 int 被提升为 double 而不是 float 以进行隐式转换

为啥我的应用程序在我将字符串(来自 EditText)解析为 Float 时崩溃

int 转 float 为啥有时会丢失精度