Баг компилятора при параметре шаблона = void* - страница 4

 
Dmitry Fedoseev:

А вы сами-то пробовали читать по этой ссылке, которую даете? Там Слава популярно объясняет почему так - потому-что в старом MQL4 был перепутан приоритет. Поэтому теперь важно привлечь внимание. Даже плохо, что только предупреждение, было бы лучше, если бы была ошибка. 

Или, подзатыльник 

 
Dmitry Fedoseev:

А вы сами-то пробовали читать по этой ссылке, которую даете? Там Слава популярно объясняет почему так - потому-что в старом MQL4 был перепутан приоритет. Поэтому теперь важно привлечь внимание. Даже плохо, что только предупреждение, было бы лучше, если бы была ошибка. 

И что? Здесь:

int i = 1 << 2 + 3;

тоже в MQL4 приоритет был перепутан? Речь об общем подходе, а не о частном случае. В указанном частном случае может и нужно выдать предупреждение\ошибку (как исключение), но зачем же его распространять на все остальное

И кроме того, в MQL4 (насколько я знаю) допустим у оператора || не было ленивости. И несмотря на это компилятор MQL5 в аналогичных случаях предупреждение не выдаёт (не предлагает разбить || на несколько атомарных операций)

Откуда следует что соответствующая страница истории перевернута

 

Добавлю к ..., что даже в Документации сказано:

"Для изменения порядка выполнения операций применяются круглые скобки, которые имеют высший приоритет"

что подразумевает что применение скобок для иных целей (не связанных с изменением порядка) нужно ещё обосновать

 
fxsaber:

Интересно, где тот порог количества программистов, когда нужно засомневаться? 5 - мало. 1000 - недостаточно. 10 000 - задуматься. И вот, наконец, N - доверяю. Однако, когда было (N-1) - еще не доверял.

Порог определяется не в абсолютном значении, а в % отношении от числа тех, кто думает иначе. Большинство может ошибаться, но не 99% - это надёжный критерий

 
A100:
А в 1961x32 все работает... ляпота!

Хм, интересная особенность. Впредь буду тогда битность платформы тоже указывать

 
A100:

И что? Здесь:

int i = 1 << 2 + 3;

тоже в MQL4 приоритет был перепутан? 

Да, в документации сказано, что в старой версии приоритет был другим.

Но на мой взгляд, это всё уже давно потеряло актуальность. И уж тем более если указана директива strict.   А если кто-то откопает древний код и попытается его скомпилировать, то ему в любом случае придётся там переделывать кучу всего. Так что эти предупреждения - уже пережиток прошлого.   Поэтому соглашусь, что предупреждениями не стоит разбрасываться на ровном месте. 

 
Сорри что не совсем по теме, подскажите если кто знает: есть ли способ в mql получить int из void*ptr кроме (int)StringFormat("%i",ptr)?
 
A100:

Поэтому в Вашем коде скобки ничего не значат, утверждение ... кажется алогичным и при наличии скобок нужно разбираться менялись в действительности приоритеты\порядок или нет, а в моем коде - скобки уже сами по себе означают изменение приоритетов\порядка (уже по наличию/отсутствию скобок все ясно)

скобки
fxsaber
A100
есть
непонятно                          
приоритеты операций изменены
нет
приоритеты операций не менялись
приоритеты операций не менялись

Скобки вносят полную однозначность в трактовке выражения.

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

A100:

Порог определяется не в абсолютном значении, а в % отношении от числа тех, кто думает иначе. Большинство может ошибаться, но не 99% - это надёжный критерий

Тот же вопрос про количество не в абсолютном, а в относительном. 98% - надежный критерий? А 97%? Где тот порог, когда нужно начать сомневаться в надежности? Да хоть 100% всех окружающих утверждают, что Вы маньяк-убийца. Это надежный критерий?

 
Ilya Malev:
Сорри что не совсем по теме, подскажите если кто знает: есть ли способ в mql получить int из void*ptr кроме (int)StringFormat("%i",ptr)?

только через строки, я раньше через StringConcatenate() получал адрес указателя, примерно так:

Cinteger *x = new Cinteger();
   string s;
   int zz=StringConcatenate(s,"*x = ",x);
   Print("OK ",s);
 
Alexey Navoykov:

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

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

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