为什么以下c ++代码无法编译?

时间:2011-06-29 09:20:55

标签: c++ const

#include <iostream>
int test( const double *t1,const double **t2 )
{
  return 0;
}
int main(int argc, char*argv[])
{
  double *t1 = new double;
  const double ** t2 = new double *;
  test(t1, t2);
}

错误是:

cannot convert double ** to const double **

如果我删除了const的2次出现,它会编译。

4 个答案:

答案 0 :(得分:3)

成功

const double ** t2 = new const double *;

答案 1 :(得分:2)

问题是通过以某种方式取消引用,你可以用双指针违反const正确性。

答案 2 :(得分:0)

它至少应该立即编译

int main(int argc, char*argv[])
{
  double *t1 = new double;
  const double ** t2 = new const double *;
  test(t1, t2);
}

答案 3 :(得分:0)

不允许进行此类转换,因为如果转换是可行的,您可以通过以下方式修改const对象:

#include <stdio.h>

const double A0 = 0;
const double A1 = 1;
const double* A[2] = { &A0, &A1 };
double * B[2];

int main()
{
  double** b = B;
  const double ** a = b; // illegal
  //const double ** a = (const double **)b; // you can simulate it would be legal

  a[0] = A[0];
  b[0][0] = 2; // modified A0

  printf("%f",A[0][0]);
}

对于模拟结果,检查code at IdeOne.com - 您将获得SIGSEGV(const对象被放置在只读内存中,您正在尝试修改它)。使用不同的平台,可以静默修改对象。