Почему следующий код C ++ не компилируется? - PullRequest
0 голосов
/ 29 июня 2011
#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 **

Компилируется, если я удаляю 2 вхождения const хотя ..

Ответы [ 4 ]

3 голосов
/ 29 июня 2011

Сделать это

const double ** t2 = new const double *;

2 голосов
/ 29 июня 2011

Проблема в том, что определенным образом отменяя ссылки, вы можете нарушить правильность констант с помощью двойных указателей.

0 голосов
/ 29 июня 2011

Такое преобразование недопустимо, поскольку, если преобразование будет возможно, вы можете изменить объект 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]);
}

Для получения смоделированного результата проверьте код в IdeOne.com - вы получите SIGSEGV (объект const был помещен в постоянную память, и вы пытаетесь его изменить).На другой платформе объект может быть изменен без уведомления.

0 голосов
/ 29 июня 2011

это должно по крайней мере компилироваться сейчас

int main(int argc, char*argv[])
{
  double *t1 = new double;
  const double ** t2 = new const double *;
  test(t1, t2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...