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

 
Koldun Zloy #:

Не равносильна. В первом случае вызывается не operator=(), а конструктор.

И не конструктор класса A, а конструктор указателя, который должен принимать только указатель.

В MQL конечно есть неявное приведение указателя к объекту, но при инициализации указателя этого делать ни в коем случае нельзя!

1. У указателя нет конструктора

2. Неявное приведение не спрашивает у Вас разрешение (можно\нельзя) - оно либо есть - либо нет

3. И где пример подтверждающий Вашу теорию? - мой пример вот:

class A {};
void OnStart()
{
    A *a1 = new A;
    A *a2 = *a1; //нормально
}

Если бы компилятор не смог создать код, то он выдал бы ошибку

 

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

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

A100, 2024.01.17 07:34

И если даже пользователи с опытом не могут элементарно этого понять, то что уже говорить о начинающих, что лишний раз подтверждает ошибочность Вашего утверждения:

Вот еще поясняющие примеры:
class A {};
void OnStart()
{
   A *a = 0 ; //(1)//Error: '0' - parameter conversion not allowed
}
class A { public:
    void operator=( int ) {} //(*)
};
void OnStart()
{
   A *a = 0; //(2)//нормально
}

В 1ом случае компилятор сообщает об ошибке, а во 2ом - нет. Почему? Да потому, что во 2ом вызывается (*) путем неявного приведения указателя к объекту. А то, что в данном случае это некорректно - это вопрос уже не к компилятору, а к пользователю

 
A100 #:

1. У указателя нет конструктора

2. Неявное приведение не спрашивает у Вас разрешение (можно\нельзя) - оно либо есть - либо нет

3. И где пример подтверждающий Вашу теорию? - мой пример вот:

Если бы компилятор не смог создать код, то он выдал бы ошибку

В этом и ошибка, что ошибка должна быть, а её нет.

Эта тема как раз для сообщений об ошибках.


 
Koldun Zloy #:

В этом и ошибка, что ошибка должна быть, а её нет.

Эта тема как раз для сообщений об ошибках.

Доказательства нужны, что должна быть ошибка, а не просто слова

Выше я привел пример, который все объясняет

 
A100 #:

Доказательства нужны, что должна быть ошибка, а не просто слова

Выше я привел пример, который все объясняет

Я бы этот пример разложил на другие две строки:

A a;

A* a1 = &a;
Это правильнее, так как operator=() вызывается для уже созданного объекта.
И получается, что мы создаём временный объект, назначаем его адрес переменной a1, и сразу его уничтожаем.

В C++ мы можем создать переменную типа ссылка.

Фактически это тот же указатель, который ведёт себя как объект, но не при инициализации.

В MQL неявное разыменование указателя превращает его в ссылку.

Поэтому логично что он будет вести себя так же.

Для однозначности нужно просто запретить неявное разыменование указателя при создании указателя.
Так же как для ссылки в C++.

 
b4127, это правильно, что компилятор не ругается?
void OnStart()
{
  int i1 = 1.0; // OK
  int i2 = 1.1; // truncation of constant value
  
  Print(typename(1.0)); // double
}
 
fxsaber #:
b4127, это правильно, что компилятор не ругается?

Правильно:

void OnStart()
{
    Print(1.0==int(1.0)); //(1)
    Print(1.1==int(1.1)); //(2)
}

потому, что в (1) случае результат true, а во (2) - false

 

Putnik 2024.01.18 15:22 #34530 

В добавок к моему сообщению.

Не удается одновременно взять несколько линий за одну точку(2), и перемещать их вместе. В МТ4 такое возможно. В МТ5 запрещено, что ли?


 
fxsaber #:
truncation of constant value

Предупреждает: "Усечение константы"

 
Putnik #:

Putnik 2024.01.18 15:22 #34530 

В добавок к моему сообщению.

Не удается одновременно взять несколько линий за одну точку(2), и перемещать их вместе. В МТ4 такое возможно. В МТ5 запрещено, что ли?


Подозреваю..., все та же история, с примагничиванием.

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