Ошибки, баги, вопросы - страница 3227

 
fxsaber #:

Статически тоже нельзя. Объект создается без каких-либо ограничений, а вот переменная, которая на него ссылается, имеет ограничения.

const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить

 
A100 #:
Отсутствует сообщение компилятора об ошибке:

А должно быть!

Вижу что компилятор C++ выдает сообщение об ошибке, но не могу понять почему, в чем смысл?

Насколько я понимаю, смысл слова const в "void f( const A*& ) {}"  в том, что ф-я не должна изменять объект, указываемый параметром.

Но почему нельзя передавать в ф-ю указатель на не-const объект?

Можете объяснить?

 
mktr8591 #:

Можете объяснить?

Вот код:

class A {};
const A *a = new A;
void f( const A*& b ) { b = a; } //(*)
void OnStart()
{
//      A *b = a;   //(1) ошибка: '=' - cannot convert from const pointer to nonconst pointer
        A *b; f(b); //(2) нормально
        Print( a,":",b );
}

Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку

 
A100 #:

Вот код:

Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку

Действительно, пусть лучше будет ошибка.
 
A100 #:

Вот код:

Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку

Пока не вижу проблемы.

class A {};
void OnStart()
{
  const A *a = new A;
  
//  A *b = a; // '=' - cannot convert from const pointer to nonconst pointer
  A *b = (A*)a; // OK.
}
 

И пора бы уже добавить ошибку компилятора в следующем месте:

class A {};
class B:public A {};

void func( B*) {}

void OnStart()
  {
   A* a =new B;
   func(a);        //здесь должна быть ошибка компилятора
   func((B*)a);    //если надо, можно так
  }
P.S. Или хотя бы warning
 
fxsaber #:

Пока не вижу проблемы.

Вы путаете явное и неявное преобразование. Вы явно преобразовали const к non const, а здесь неявное (помимо воли пользователя)

 
В этом и заключается проблема:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2022.08.22 18:49

const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить

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

 
A100 #:

Вы путаете явное и неявное преобразование. Вы явно преобразовали const к non const, а здесь неявное (помимо воли пользователя)

Неявные же по четким правилам должны происходить. Почему здесь это правило не прописано - не знаю. Вместо ошибки логично выдавать предупреждение и только.

 
A100 #:
В этом и заключается проблема:

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

Странная логика, когда const-объект становится nonconst.

class A
{
public:
  int i;
};
void OnStart()
{
  const A a;
 
//  a.i = 123; // 'i' - constant cannot be modified
  ((A*)(&a)).i = 123; // OK.
  ((A)(a)).i = 123; // OK.
  Print(a.i);
}

Поэтому и говорю, что все объекты являются nonconst. И только переменные (включая временные), что на них ссылаются, могут иметь свойство const.