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

fxsaber #:

Забыли выделить.

Также операторы  && || ,  теряют свои уникальные свойства при перегрузке: ленивость для первых двух и очерёдность для запятой (порядок выражений между запятыми строго определён, как лево-ассоциативный, то есть слева-направо).

Выделили Вам специально, на случай, если прочесть грамотно не смогли - теряет только ленивость (!)

A100 #:

Выделили Вам специально, на случай, если прочесть грамотно не смогли - теряет только ленивость (!)

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

Мдя. А ведь тема интересная. И тут совсем не в && дело, а в f(a).Method(f(b)).

Покурил я https://en.cppreference.com/w/cpp/language/eval_order

Суть в чем. Там от стандарта к стандарту все меняется. Так вот, в c++17 добавили:

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

И все стало, так как и хочет A100. А вот, до с++17 есть только это:

When calling a function (whether or not the function is inline, and whether or not explicit function call syntax is used), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.

ставим в msvc c++14 и смотрим

#include <iostream>

struct A
{
    int a;
    bool operator && (const A& o) const
    {
        std::cout << "&&";
        return a != 0 && o.a != 0;
    }
};

A f(int a)
{
    std::cout << a;
    return A{ a };
}

bool Test(int a, int b)
{
    return f(a) && f(b);
}

int main()
{
    Test(1,2);
}

msvc c++14 выдает 21&&

Поэтому тут уже на откуп разработчикам. Если они используют c++17 и выше, то я бы в багу занес и пофиксил. А если вдруг у них лютый легаси, то засел бы за рефакторинг и в результате все равно пофиксилось бы, как-то так...

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 #:

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

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