代码之家  ›  专栏  ›  技术社区  ›  Omry Yadan

为什么在将__float**_trade转换为__const float**_trade时出错?

  •  29
  • Omry Yadan  · 技术社区  · 15 年前

    我有一个接收 float** 作为一个论点,我试图改变它 const float** .

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

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

    这对我来说毫无意义,我知道(并证实)我可以通过 char* 到一个函数 const char* 为什么不 常量浮动** ?

    4 回复  |  直到 9 年前
        1
  •  20
  •   Mike    9 年前

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

    因为转换 Foo** 艾斯 const Foo** 会是无效和危险的…转换的原因 福* 艾斯 常量foo** 危险的是,它会让您在没有强制转换的情况下,悄悄地意外地修改const foo对象。

    引用接着给出了一个示例,说明这种隐式转换如何允许我修改 const 没有强制转换的对象。

        2
  •  22
  •   haccks    11 年前

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

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

    “尾注”]

        3
  •  10
  •   Mogsdad    12 年前

    其他ANWER已经解释了为什么这是C++中的一个错误。

    我来回答你问题背后的问题。您希望在函数的接口中声明,您的函数不会修改数组中包含的浮点值。很好的意图,并使您的函数 const float ** 数组。你问题背后的问题是,如何做到这一点而不解决丑陋的石膏。

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

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

    现在可以使用 float ** (这就是你问题中的例子) 常量浮动** 常量浮点*常量* 论据。

        4
  •  8
  •   sth    15 年前

    如果将参数转换为 const float** 然后你可以存储一个 const float* 在参数指向的内存位置。但是调用函数认为这个内存位置应该包含一个非常量 float* 以后可能会试图改变这一点 float .

    因此,您不能 float** 到A 常量浮动** ,它将允许您在预期指向可变值的指针的位置存储指向常量的指针。

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

    推荐文章