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

 
A100 #:

Если статически можно

то и динамически можно

разницы (в смысле const) нет никакой

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

 
A100 #:
К тому же в ряде случаев переменная вообще не нужна:

Нужна для удаления.

 

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

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

A100, 2022.08.22 16:48

Отсутствует сообщение компилятора об ошибке:
class A {};
void f( const A*& ) {}
void OnStart()
{
    A *a;
    f( a ); //нет ошибки ???
}

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

Все правильно. По аналогии.

void f( const int& ) {}
void OnStart()
{
  int i = 0;
  
  f(i);
}

const - свойство переменной, а не объекта за ней.

 
fxsaber #:

Все правильно. По аналогии.

const - свойство переменной, а не объекта за ней.

Аналогия неправильная хотя бы по формальному признаку (даже без вникания в детали): у меня *&, а у Вас &

Подсказка: все примеры предварительно в C++ проверил - там не дураки сидят!
 
fxsaber #:

Нужна для удаления.

Это какой то стереотип - вот удалил без переменной:

class A {
public:
   const A *f() const { Print(__FUNCSIG__); return &this; }
};
void OnStart()
{
   delete((new A const).f());
}
 
A100 #:

Аналогия неправильная хотя бы по формальному признаку (даже без вникания в детали): у меня *&, а у Вас &

Никакой разницы.

Подсказка: все примеры предварительно в C++ проверил - там не дураки сидят!

Свою гипотезу объяснил Вам. Авторитетов не имею.

 

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

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

A100, 2022.08.22 17:32

Это какой то стереотип - вот удалил без переменной:

class A {
public:
   const A *f() const { Print(__FUNCSIG__); return &this; }
};
void OnStart()
{
   delete((new A const).f());
}

Временные переменные никто не отменял.

class A {
public:
   const A *f() const { Print(__FUNCSIG__); return &this; }
};
void OnStart()
{
   delete((new A const).f()); // A*
   delete(((const A*)(new A)).f()); // const A* 
   delete((new A).f()); // Почему не ругается компилятор (A* вызывает const-метод) - не знаю.
}
 
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), поэтому С++ при компиляции (*) выдает ошибку

Причина обращения: