Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - страница 22

 
Ilyas #:

Будет оператор using, который решит проблему ограничения функционала (сделает поведение компилятора "как раньше")

В следующей бете (build > 5223) будет доступен оператор using (пока исключительно для использования в объектах).


Также, 'operator=' будет неявно генерироваться для всех типов объектов, если он возможен: нет константных полей и нет полей и родителей, в которых 'operator=' недоступен

Такая неявная генерация оператора сломает существующие коды, в которых использовался operator= предка, пример:

struct A
  {
   int _;
  
   string operator=(int x)
     {
      return(__FUNCSIG__);
     }
  };
  
struct B : A
  {   
  };

void OnStart()
  {
   B b;
   b=100;    // можно было использовать 'A::operator=' до билда 5223
  }

с билда >5223, компиляция такого кода завершится с ошибками:

cannot convert parameter 'const int' to 'const B&'
   implicit void B::operator=(const B&)
see hidden function(s):
   implicit void A::operator=(const A&)
   string A::operator=(int)


Обойти такую ошибку можно двумя способами:

  1. явно привести левую часть к нужному типу
    (A&)b=100;

  2. использовать using для operator=
    struct B : A
      {
       using A::operator=;
      };
    

 
fxsaber #:
Это что за название переменной?!
Символ подчеркивания. Допустимо использовать в именах переменных.
 

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

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5

MetaQuotes, 2025.07.31 14:50

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

Почему сейчас (b5222) нет предупреждения и вызывается базовый оператор?

struct A
  {
   int _;
  
   void operator=(short x)
     {
      Print(__FUNCSIG__);
     }
  };
  
struct B : A
  {   
   void operator=(int x)
     {
      Print(__FUNCSIG__);
     }
  };

void OnStart()
  {
   B b;
   b=(short)100;    // void A::operator=(short)
  }
В b5223+ выполнение такого кода будет таким же, как в b5222?
 
Ilyas #:
Также, 'operator=' будет неявно генерироваться для всех типов объектов

Почему не copy constructor? Вы ведь сами о нем упоминали, а теперь генерируете вместо него 'operator='

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

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

Ilyas, 2024.03.11 15:50

Потому, что C++ генерирует конструктор копирования по умолчанию, а MQL5 нет (пока/до сих пор).

 
Vladislav Boyko #:
Почему не copy constructor?

Или copy constructor уже генерируется? Я запутался.

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

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5

Ilyas, 2025.08.04 14:08

Из главного, не вошло создание неявного конструктора копий для объектов пользователя (для встроенных объектов добавляется, например для MqlTick).

Это ведь его работа (неявного конструктора копирования)? 'operator=' не должен бы справиться с константным полем, если я не ошибаюсь.

Forum on trading, automated trading systems and testing trading strategies

Did Structs Change with the last MT5 Update?

Vladislav Boyko, 2025.08.19 22:29

Даже добавление константного поля не приводит к предупреждению:


 
Vladislav Boyko # :

Почему не copy constructor? Вы ведь сами о нем упоминали, а теперь генерируете вместо него 'operator='

Потому что это присваивание. Переменная b уже создана.

 
fxsaber # :

Почему сейчас (b5222) нет предупреждения и вызывается базовый оператор?

В b5223+ выполнение такого кода будет таким же, как в b5222?

Не думаю. Должен вызываться B::operator=

 
Alain Verleyen #:

Не думаю. Должен вызываться B::operator=

Если вы правы, то тогда нельзя будет обнаружить проблему, т.к. нет (сейчас) никаких предупреждений компилятора.