Как string преобразуется в bool? - страница 4

 
George Merts:

Мне кажется, что тут надо глядеть по обстоятельствам. Где-то сила, а где-то потенциальные проблемы.

С удовольствием бы научился чему-то новому для себя, если бы Вы показали на примере.
 
fxsaber:
С удовольствием бы научился чему-то новому для себя, если бы Вы показали на примере.

Давай на "ты", дружище fxsaber.

И, думаю, ты и сам достаточно опытен.

А я привел пример - что бывает, если один макрос вернет байт, другой - интегер, и значения в цикле будут сравниваться. Если значение интегера больше 255, то в данном случае возникнет зацикливание, и именно на такую ошибку я когда-то нарвался в довольно критичном участке кода. Главная засада была в том, что ошибка была "плавающей", воспроизвести ее было  очень непросто, далеко не всегда значение интегера превышало 255.

Именно в этом я и считаю недостаток макросов - недостаточно строгая проверка типов.

 
George Merts:

Именно в этом я и считаю недостаток макросов - недостаточно строгая проверка типов. 

Понял. Это и есть опыт, когда четко осознаешь, что делаешь.
 

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

Как string преобразуется в bool?

pavlick_, 2016.12.01 12:36

А чего так смущает, по-моему очевидно, что прикрутили что-то вроде bool string::operator bool() {return ! this.empty();}. Я был больше удивлён из-за такой ерунды (алерт срабатывает):
string s;
if(s != "")
   Alert(s);

Когда-то пытался возмущаться, но мне объяснили, что это, оказывается, нормально.

Конечно, нормально.

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

Библиотеки: TypeToBytes

fxsaber, 2017.04.19 17:17

Чем отличается NULL-строка от пустой?
#include <TypeToBytes.mqh>

#define PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{  
  const string StrNull = NULL;
  
  PRINT(ArraySize(_R(StrNull).Bytes))
  PRINT(ArraySize(_R("").Bytes))
}

Результат

ArraySize(_R(StrNull).Bytes) = 0
ArraySize(_R().Bytes) = 1

NULL-строка имеет нулевую длину в байтах. Пустая - длина 1 байт (там ноль - конец строки).


Поэтому алерт не сработает на NULL-сравнении.

 

Хм, раньше не видел эту ветку,  вот оказывается откуда ноги растут у решения разработчиков о запрете приведения string->bool.   На мой взгляд, они погорячились, т.к. нужно было запретить только неявное приведение, а не рубить всё под корень.

Печально, что в последние полгода язык меняется лишь в сторону ограничений и ужесточений, никакого развития.  А ведь ещё так много вещей не хватает в MQL.

 

Написал бы что принтит этот код, для наглядности

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