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

 
Koldun Zloy #:

Это порядок вычисления всего выражения, а не его подвыражений.

Почитайте здесь.

пункт 6

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.

Другими словами слева-направо

 
Koldun Zloy #:

В любом компиляторе C++.

И не справа налево, а как захочется компилятору.

В стандарте языка это не определено.

Здесь на вызов оператора bool(const A&,const A&), а вызов метода void A::operator &&(const A&). Поэтому, вроде как да, это баг компилятора.

Но, есть одно но, из великого и могучего: https://en.cppreference.com/w/cpp/language/eval_order

Так вот. Я несколько раз перечитал, тема реально мутнейшая, и не нашел в стандарте указания, что . порождает sequence point.

Поэтому, если я все правильно понимаю (тут я не уверен на 100%, если есть спецы по теме, поправьте, но только с ссылками на стандарт), то при вызове f(1).operator &&(f(2)), компилятор реально имеет право вызвать f(1) и f(2) в любом порядке.

 
fxsaber #:

Если отказаться от операторов в пользу методов, то будет понятнее причина.

У каждой ошибки есть какая то причина

 
Vladimir Simakov #:

Чем Вас п.6 не устроил ?

 
A100 #:

пункт 6

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.

Другими словами слева-направо

https://en.cppreference.com/w/cpp/language/operator_logical

  • Builtin operators  && and  || perform short-circuit evaluation (do not evaluate the second operand if the result is known after evaluating the first), but overloaded operators behave like regular function calls and always evaluate both operands.
 
Так, что нормально все, компилятор в своем праве)
 
Vladimir Simakov #:
Так, что нормально все, компилятор в своем праве)
  • Builtin operators  && and  || perform short-circuit evaluation (do not evaluate the second operand if the result is known after evaluating the first), but overloaded operators behave like regular function calls and always evaluate both operands.

Это означает лишь то, что правый должен в любом случае вычисляться наряду с левым, а порядок вычисления определяется п.6

слева-направо
 
A100 #:
  • Builtin operators  && and  || perform short-circuit evaluation (do not evaluate the second operand if the result is known after evaluating the first), but overloaded operators behave like regular function calls and always evaluate both operands.

Это означает лишь то, что правый должен в любом случае вычисляться наряду с левым, а порядок вычисления определяется п.6

Нет, не определяется. 

 behave like regular function calls

Это обычная функция, которая никакого отношения к оператору && уже не имеет. Если я не прав, то укажи на пункт стандарта

 
Vladimir Simakov #:
behave like regular function calls

Т.е. в Microsoft дураки сидят ?!

#ifdef __cplusplus
class A {
public:
    A() {}
    A(const A&) {}
    void operator&&(const A&) { Print(3); }
    void operator&=(const A&) { Print(3); }
};
A f( int i ) { printf( "%d", i ); return A(); }
int main()
{                 //Результат:
    f(1) && f(2); //1-2-3
    f(1) &= f(2); //2-1-3
    return 0;
}
#endif

В одном случае 1-2-3, а в другом 2-1-3 сделали ?

 
A100 #:

Т.е. в Microsoft дураки сидят ?!

В одном случае 1-2-3, а в другом 2-1-3 сделали ?

Да не кто не думал, как лучше. Так получилось просто)