Статически тоже нельзя. Объект создается без каких-либо ограничений, а вот переменная, которая на него ссылается, имеет ограничения.
const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить
class A {};
const A *a = new A;
void f( const A*& b ) { b = a; } //(*)
voidOnStart()
{
// A *b = a; //(1) ошибка: '=' - cannot convert from const pointer to nonconst pointer
A *b; f(b); //(2) нормальноPrint( a,":",b );
}
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Пока не вижу проблемы.
class A {};
voidOnStart()
{
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*) {}
voidOnStart()
{
A* a =new B;
func(a); //здесь должна быть ошибка компилятора
func((B*)a); //если надо, можно так
}
const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить
Грамотный компилятор поместит const объект в защищенную (только для чтения) память. Неявное преобразование будет пытаться его изменить, но не сможет - т.е. при выполнении будет трудноуловимая вычислительная ошибка. А явное преобразование указывает компилятору, что const объект не нужно помещать в защищенную память, поскольку он будет в дальнейшем изменен
Вы путаете явное и неявное преобразование. Вы явно преобразовали const к non const, а здесь неявное (помимо воли пользователя)
Неявные же по четким правилам должны происходить. Почему здесь это правило не прописано - не знаю. Вместо ошибки логично выдавать предупреждение и только.
Грамотный компилятор поместит const объект в защищенную (только для чтения) память. Неявное преобразование будет пытаться его изменить, но не сможет - т.е. при выполнении будет трудноуловимая вычислительная ошибка. А явное преобразование указывает компилятору, что const объект не нужно помещать в защищенную память, поскольку он будет в дальнейшем изменен
Странная логика, когда const-объект становится nonconst.
class A
{
public:
int i;
};
voidOnStart()
{
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.
Статически тоже нельзя. Объект создается без каких-либо ограничений, а вот переменная, которая на него ссылается, имеет ограничения.
const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить
Отсутствует сообщение компилятора об ошибке:
А должно быть!
Вижу что компилятор C++ выдает сообщение об ошибке, но не могу понять почему, в чем смысл?
Насколько я понимаю, смысл слова const в "void f( const A*& ) {}" в том, что ф-я не должна изменять объект, указываемый параметром.
Но почему нельзя передавать в ф-ю указатель на не-const объект?
Можете объяснить?
Можете объяснить?
Вот код:
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Вот код:
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Вот код:
Если (*) компилируется без ошибки, тогда вместо (1) можно было бы записать (2) - т.е. мы неявно обходим ограничение (1), поэтому С++ при компиляции (*) выдает ошибку
Пока не вижу проблемы.
И пора бы уже добавить ошибку компилятора в следующем месте:
P.S. Или хотя бы warningПока не вижу проблемы.
Вы путаете явное и неявное преобразование. Вы явно преобразовали const к non const, а здесь неявное (помимо воли пользователя)
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
A100, 2022.08.22 18:49
const - это не украшение - в грамотных компиляторах const объекты помещают в защищенную (только для чтения) область памяти, т.е. вы даже явно (обойдя программные ограничения) не сможете его изменить
Грамотный компилятор поместит const объект в защищенную (только для чтения) память. Неявное преобразование будет пытаться его изменить, но не сможет - т.е. при выполнении будет трудноуловимая вычислительная ошибка. А явное преобразование указывает компилятору, что const объект не нужно помещать в защищенную память, поскольку он будет в дальнейшем изменен
Вы путаете явное и неявное преобразование. Вы явно преобразовали const к non const, а здесь неявное (помимо воли пользователя)
Неявные же по четким правилам должны происходить. Почему здесь это правило не прописано - не знаю. Вместо ошибки логично выдавать предупреждение и только.
В этом и заключается проблема:
Грамотный компилятор поместит const объект в защищенную (только для чтения) память. Неявное преобразование будет пытаться его изменить, но не сможет - т.е. при выполнении будет трудноуловимая вычислительная ошибка. А явное преобразование указывает компилятору, что const объект не нужно помещать в защищенную память, поскольку он будет в дальнейшем изменен
Странная логика, когда const-объект становится nonconst.
Поэтому и говорю, что все объекты являются nonconst. И только переменные (включая временные), что на них ссылаются, могут иметь свойство const.