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

 
fxsaber #:

Снова выбрали авторитет, теперь вместо GPT стал Microsoft. Определяемые пользователем операторы - всегда методы.

Выделенное может быть любой отсебятиной. В данном случае даже не bool, как ниже.

Ваше понимание запутано из-за применения слов оператор и одинакового синтаксиса для && и operator&&.

Не только Microsoft - возьмите любой (!) C++ компилятор (кроме MQL)

Слова не нужны - нужен пример, доказывающий, что Microsoft и все остальные (кроме MQL) - не правы

Ваш пример аналогии с функцией не подходит, потому что как минимум приоритет у перегруженных операторов сохраняется (даже в MQL), а значит уже нет полной аналогии

 
A100 #:

Не только Microsoft - возьмите любой (!) C++ компилятор (кроме MQL)

Слова не нужны - нужен пример, доказывающий, что Microsoft и все остальные (кроме MQL) - не правы

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

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

Если второе - то это случайность.

 
fxsaber #:

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

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

А чем Вас объяснение чата не устраивает?

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

Ошибки, баги, вопросы

A100, 2024.01.31 18:47

Важно помнить, что перегрузка расширяет возможности языка, а не изменяет язык

Нельзя менять приоритет и ассоциативность (слева направо или справа налево) операторов.

Добавлю из справки по MQL

Операция

Описание

Порядок выполнения

&&

Логическая операция И

Слева направо

 
A100 #:

А чем Вас объяснение чата не устраивает?

Вы прикалываетесь?!

 
fxsaber #:

Вы прикалываетесь?!

У перегруженного && теряется только ленивость, но сохраняется приоритет и ассоциативность. Первый раз вижу, чтобы в Википедии что то было выделено, да еще и фиолетовым цветом - видимо это специально сделали для таких как Вы - нежелающих признать очевидные вещи:

Обычные операторы[править | править код]

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

 
A100 #:

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

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

 
A100 # :

У перегруженного && теряется только ленивость , но сохраняется приоритет и ассоциативность . Первый раз вижу, чтобы в Википедии что то было выделено, да еще и фиолетовым цветом - видимо это специально сделали для таких как Вы - нежелающих признать очевидные вещи:

Обычные операторы [ править  |  править код ]

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

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

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

 
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 и выше, то я бы в багу занес и пофиксил. А если вдруг у них лютый легаси, то засел бы за рефакторинг и в результате все равно пофиксилось бы, как-то так...

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