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

 
Vladimir Simakov #:

тут совсем не в && дело, а в f(a).Method(f(b)).

Да. И этот пример либо баг, либо специально задокументированное поведение с объяснением причин.
 
Vladimir Simakov #:

Так вот, в c++17 добавили:

In a function-call expression, the expression that names the function is sequenced before every argument expression and every default argument.

И все стало, так как и хочет A100.

Да, очевидную вещь закрепили в современном стандарте (since C++20)

И почему мы должны руководствоваться устаревшим ПО (until C++17) ??

 
Alain Verleyen #:

Википедия не предоставляет источника для этого утверждения об ассоциативности. Ты сам это написал? ;-)

https://en.cppreference.com/w/cpp/language/operators#Rarely_overloaded_operators

(until C++17) УСТАРЕЛО!
 
fxsaber #:
Да. И этот пример либо баг, либо специально задокументированное поведение с объяснением причин.

Это не баг, это операторы разные.

 
A100 #:
(until C++17) УСТАРЕЛО!

Почему это сразу устарело? С++20 до сих пор не все компиляторы в полном объеме поддерживают. По сути, в основном, С++14/17 везде используют. 20-ый редкость редкая.

 
A100 # :
(until C++17) УСТАРЕЛО!

Ну давай же. MetaQuotes не следует никаким стандартам MQL и, конечно же, C++17. MQL основан на C++, ни больше, ни меньше.

В любом случае, только MetaQuotes может сказать что-то полезное по этому вопросу. Мое мнение: это не ошибка, порядок последовательности не определен, и на него не следует полагаться. Хотя я понимаю вашу логическую точку зрения.

 
fxsaber #:

Выхожу из обсуждения. Теперь Вики авторитет.

Завтра новая лютая ошибка (только обнаружил) - готовьтесь

 
Vladimir Simakov #:

Это не баг, это операторы разные.

Утверждаете, что эти два оператора не являются завуалированными методами? Где почитать про это?

 
Cуществует простое доказательство на базе MQL, что && не равносильно operator&& - это разный результат:
class A {
public:
    A() {}     A(const A&) {}
    A operator&&(const A&) { Print(3); return this; }
    A operator||(const A&) { Print(4); return this; } 
};
A f( int i ) { Print( i ); return A(); }
void OnStart()
{                                           //Результат:
    f(1)         || f(2)          && f(5);  //5-2-3-1-4
    f(1).operator||(f(2)).operator&&(f(5)); //5-2-1-4-3
}
 

A100 # :
Cуществует простое доказательство на базе MQL, что && не равносильно operator&& - это разный результат:

Вы должны быть честными с приоритетом.

//Результат:
  (f(1)        || f(2))         && f(5);  //5-2-1-4-3
  f(1).operator||(f(2)).operator&&(f(5)); //5-2-1-4-3
Причина обращения: