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

  • &&,  ||, and  , (comma) lose their special sequencing properties when overloaded and behave like regular function calls even when they are used without function-call notation.  (until C++17)

До C++17 operatator&& - обычный метод. 

fxsaber #:

До C++17 operatator&& - обычный метод. 

Обрати внимание на это

  • The overloads of operators  && and  || lose short-circuit evaluation.

В любом случае будут оценены оба операнда. То, что ты написал, это как раз в тему к А100, каюсь, не заметил. Да, начиная после c++17 при перегрузке перестает теряться

Every value computation and side effect of the first (left) argument of the built-in logical AND operator &&, the built-in logical OR operator || and the built-in comma operator , is sequenced before every value computation and side effect of the second (right) argument.

Это значит, что стандарт гарантирует последовательность оценки операндов. В нашем случае сначала должно вызываться f(1) и только потом f(2).

PS Я же говорю, Будапешт отдыхает)))

Vladimir Simakov #:

всем коллективом, пару-тройку недель, выпиливали UB из десятилетнего легаси, пока не добились детерминированного результата.

В свежей библиотеке написал такое.
  static string Merge_INPUT_STRUCT( const string &Str, const string &Str2[] )
  {
    const int Size = ::ArraySize(Str2);

    string Res = Size ? Str2[0] : NULL;

    if (Size)
      for (int i = 1, Pos = ::StringLen(Str2[0]); i < Size; Pos += ::StringLen(Str2[i++]))
      {
        Pos = ::StringFind(Str, Str2[i], Pos);

        Res += ::StringSubstr(Str, Pos - 1, 1) + Str2[i];
      }

    return(Res);
  }

Это UB?

fxsaber #:
В свежей библиотеке написал такое.

Это UB?

Нет, но стиль опасный.

Vladimir Simakov #:

Every value computation and side effect of the first (left) argument of the built-in logical AND operator &&, the built-in logical OR operator || and the built-in comma operator , is sequenced before every value computation and side effect of the second (right) argument.

Вроде, речь идет не об operator&& , а о &&.
Vladimir Simakov #:

Нет, но стиль опасный.

Опасный стиль тоже в команде выпиливаете?

Alain Verleyen #:

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

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

В данном вопросе мы просто не обратили внимание на обновление стандарта C++17, где впервые явно указан порядок исполнения параметров перегруженной операции. До этого был UB

Мы следим за данной дискуссией, но пока ничего не обещаем

Slava #:

В данном вопросе мы просто не обратили внимание на обновление стандарта C++17, где впервые явно указан порядок исполнения параметров перегруженной операции. До этого был UB

Просьба привести цитату.

fxsaber #:

Опасный стиль тоже в команде выпиливаете?

Не. Это мой личный болезненный опыт)))

mutable data менять либо в loop-statement, либо в  iteration-expression. При смешении, можно много кофе (и не только) выпить, пока найдешь где ты сам себе злобный буратино)))

Vladimir Simakov #:

mutable data менять либо в loop-statement, либо в  iteration-expression. При смешении, можно много кофе (и не только) выпить, пока найдешь где ты сам себе злобный буратино)))

Понял, спасибо.