Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - страница 42

 

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

Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике

fxsaber, 2021.02.14 18:43

Какая-то особенность NULL, что вызывает ошибку компиляции.
void f( const string ) {}
void f( const string& ) {}

void OnStart()
{
  f(_Symbol + "");   //(1)
  f(_Symbol + NULL); //(2) 'f' - ambiguous call to overloaded function with the same parameters
}

С точки зрения C++ ошибка при компиляции должна быть в обоих случаях (1) и (2)

А с точки зрения MQL: 

_Symbol + ""   не равнозначно _Symbol //(3)
_Symbol + NULL    равнозначно _Symbol //(4)

Из (4) следует, что если

f(_Symbol       ); //(5) ошибка при компиляции

то и

f(_Symbol + NULL); //(2) ошибка при компиляции
Другими словами, если Вы допускаете, что строка (1) без ошибки - это нормально, то ошибку в (2) тоже можно оправдать
 
Vladimir Belozercev:

Вызов конструктора класса по-умолчанию из параметрического конструктора вызывает деструктор класса на выходе из параметрического конструктора. Есть какие-то запреты на использование такой конструкции или это бага компилятора?

Код, демонстрирующий проблему, прилагаю.

Всё правильно.

Когда Вы в теле одного конструктора вызываете другой конструкторсоздаётся ещё один объект и при выходе из конструктора первого объекта он уничтожается.

 
A100:

С точки зрения C++ ошибка при компиляции должна быть в обоих случаях (1) и (2)

А с точки зрения MQL: 

Из (4) следует, что если

то и

Другими словами, если Вы допускаете, что строка (1) без ошибки - это нормально, то ошибку в (2) тоже можно оправдать

Разве NULL это такой макрос?

#define NULL
 
A100:

С точки зрения C++ ошибка при компиляции должна быть в обоих случаях (1) и (2)

А с точки зрения MQL: 

Из (4) следует, что если

то и

Другими словами, если Вы допускаете, что строка (1) без ошибки - это нормально, то ошибку в (2) тоже можно оправдать
Проблема не в сложении строки и NULL, а в том, что такой вызов 
f(_Symbol + NULL);
никак не может быть вызовом
void f( const string& ) {}
поэтому ambiguous - ошибка компилятора.
 
Vladimir Belozercev:

Вызов конструктора класса по-умолчанию из параметрического конструктора вызывает деструктор класса на выходе из параметрического конструктора. Есть какие-то запреты на использование такой конструкции или это бага компилятора?

Код, демонстрирующий проблему, прилагаю.

  внутри { } вы просто создаете объект, который при выходе из области видимости автоматически уничтожается

  можете использовать вот такую конструкцию

class clTuneParam
  {
public:
                     clTuneParam(void);
                     clTuneParam(eParType iParType);
                    ~clTuneParam(void);
protected:
   void              Setup(void) {Print("default operations");}
  };
//---
clTuneParam::clTuneParam(void)
  {
   Print("Constructor default clTuneParam");
   Setup();
  }
//---
clTuneParam::clTuneParam(eParType iParType)
  {
   Print("Constructor clTuneParam with Pars");
   Setup();
  }


 
Ilyas :

Будет зависеть от вызываемой функции:

  1. инлайнинг

  2. удаление параметров вызовов

  3. оптимизация доступа к глобальным переменным



Я рекомендую воздержаться от использования модулей, мы планируем изменение в их работе, теоретически могут возникнуть проблемы в совместимости версий.
@Ilyas Есть ли какой-либо план включения библиотек (модулей) в качестве ресурса? Так что возможность использовать их в продуктах, опубликованных на Маркете.
 
fxsaber:

Разве NULL это такой макрос?

Если это было бы так, то была бы другая ошибка:

#define NULL
void OnStart()
{
  f(_Symbol + NULL); //(2) '+' - operand expected
}
Компилятор в случае (1) проявил одну "гибкость" (не выдав ошибку). А в случае (2) другую: заменив  _Symbol + NULL на _Symbol

Вопрос в том: нужны ли такие "гибкости" или все должно быть строго. А если в одном месте имеет место гибкость, то почему в другом нельзя?

 
Edgar Akhmadeev:
Проблема не в сложении строки и NULL, а в том, что такой вызов 
f(_Symbol + NULL);
никак не может быть вызовом
void f( const string& ) {}
поэтому ambiguous - ошибка компилятора.

если не может, то остается единственный вызов  void f( const string ) {} (*) и ошибки бы не было, а она есть. Поэтому такое объяснение не годится (само себе противоречит)

Более того функция  void f( const string& ) {} (**) в MQL вообще никогда не будет вызвана. В любом выражении всегда будет вызываться (*), что как пример происходит в случае (1) 

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

Хочется STL подобного

A100, 2019.06.09 21:30

А в чем возможность? В том что (2) нельзя вызвать даже явно? В этом гибкость заключается?

 
A100:

функция  void f( const string& ) {} (**) в MQL вообще никогда не будет вызвана.

Иногда функции, которые заведомо не могут быть вызваны, добавляются для большего контроля исходника.

 
fxsaber:

Иногда функции, которые заведомо не могут быть вызваны, добавляются для большего контроля исходника.

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