【问题标题】:gcc error: invalid conversion from double* to const doublegcc 错误:从 double* 到 const double 的无效转换
【发布时间】:2014-05-23 15:15:41
【问题描述】:

我使用的是 gcc 版本 4.5.0。使用下面的简单示例,我会假设得到一个错误 invalid conversion from double* to const double*

#include <iostream>
using namespace std;

void foo(const double *a)
{
    cout<<a[0]*2.<<endl;
}

int main()
{
    double *a=new double[2];
    a[0]=1.;
    a[1]=2.;
    foo(a);
    return 1;
}

为什么编译没有错误?

反例如下:

#include<iostream>
using namespace std;

void foo(const double **a)
{
cout<<a[0][0]*2.<<endl;
}


int main()
{
    double **a=new double*[2];
    a[0]=new double[2];
    a[1]=new double[2];
    a[0][0]=1.;
    foo(a);
    cout<<a[0][0]<<endl;
    return 1;
}

(第二个示例的解决方案:将 foo 定义为 foo(const double*const* a)。感谢 Jack Edmonds 的评论,这解释了错误消息)

【问题讨论】:

  • 为什么转换无效?
  • 因为在使用双 **a 的情况下会出现转换错误。

标签: c++ gcc


【解决方案1】:

通常,在 C 和 C++ 中,您可以隐式地使事物“更加恒定”,但不能“更加恒定”。因此,您可以将非常量对象传递给接受 const 对象的函数。

基本上方法声明中的 const 参数是函数承诺不修改参数的方式。

您可以查看此问题以获取更多信息:Question about const_cast in c++

【讨论】:

  • 我发现奇怪的是,我在一个更复杂的函数中收到了这个错误消息。尽管与简单示例相比,该函数也没有操作数组,但编译器会发送此错误。因此我想知道编译器使用的是哪些标准。
  • prog.cpp:585:55:错误:从 'double***' 到 'const double***' 的无效转换 prog.cpp:585:55:错误:初始化参数 5' void foo(uint, scaling, uint, double, const double***, double**)'
  • 我很困惑,因为在以下示例中我收到一条错误消息:#include using namespace std; void foo(const double **a) { cout
  • 啊。在这种情况下,请参阅parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 基本上,将您的声明更改为 void foo(double const* const *);
【解决方案2】:

您可以将非常量指针传递给采用 const 指针的函数。你不能反过来做,因为那会违反 constness。

【讨论】:

    【解决方案3】:

    您必须能够初始化 const 数据类型。可以将double* 传递给const double* 的参数。这样你就可以在调用者中做你需要做的事情,但被调用者不能改变你所说的const

    当你走另一条路时,你会得到错误和警告。

    【讨论】:

      【解决方案4】:

      double *const double * 的转换作为参数类型是有效的,因为您有很多答案可以告诉您这一点。

      但是,您之前可能已经看到了一个奇怪的陷阱,它无法编译,这可能是您现在感到困惑的原因。如果您没有看到类似的无法编译的代码,您可能想跳过这个答案,因为它可能会让您感到困惑,而不是帮助。我只是添加额外的细节,以防你认为你以前看到这不起作用。

      有时可能会违反 const 属性,因为通过 CALLER 中具有较少 const 的 const 类型参数指针将 const 类型粘贴回 CALLER。这确实会导致编译错误,乍一看就像您所做的相同类型的转换。例如,如果你有 void bar(const double **a) 函数并在你的 main 中使用 foo(&amp;a) 调用它,你会得到一个编译错误,即使它看起来像是另一种情况,它只出现在你让一个类型更恒定。

      请参阅此question,了解有关该情况的更多详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 2020-10-02
        • 2015-10-15
        • 2017-11-29
        • 2013-05-02
        相关资源
        最近更新 更多