Every value computation and side effect of the first (left) argument of the built-inlogicalAND operator&&, the built-in logical OR operator||and the built-incomma operator,is sequenced before every value computation and side effect of the second (right) argument.
Так вот. Я несколько раз перечитал, тема реально мутнейшая, и не нашел в стандарте указания, что . порождает sequence point.
Поэтому, если я все правильно понимаю (тут я не уверен на 100%, если есть спецы по теме, поправьте, но только с ссылками на стандарт), то при вызове f(1).operator &&(f(2)), компилятор реально имеет право вызвать f(1) и f(2) в любом порядке.
Every value computation and side effect of the first (left) argument of the built-inlogicalAND operator&&, the built-in logical OR operator||and the built-incomma operator,is sequenced before every value computation and side effect of the second (right) argument.
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
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
Это обычная функция, которая никакого отношения к оператору && уже не имеет. Если я не прав, то укажи на пункт стандарта
Это порядок вычисления всего выражения, а не его подвыражений.
Почитайте здесь.
пункт 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.
Другими словами слева-направо
В любом компиляторе 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) в любом порядке.
Если отказаться от операторов в пользу методов, то будет понятнее причина.
У каждой ошибки есть какая то причина
Чем Вас п.6 не устроил ?
пункт 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
Так, что нормально все, компилятор в своем праве)
Это означает лишь то, что правый должен в любом случае вычисляться наряду с левым, а порядок вычисления определяется п.6
слева-направоЭто означает лишь то, что правый должен в любом случае вычисляться наряду с левым, а порядок вычисления определяется п.6
Нет, не определяется.
behave like regular function calls
Это обычная функция, которая никакого отношения к оператору && уже не имеет. Если я не прав, то укажи на пункт стандарта
behave like regular function calls
Т.е. в Microsoft дураки сидят ?!
В одном случае 1-2-3, а в другом 2-1-3 сделали ?
Т.е. в Microsoft дураки сидят ?!
В одном случае 1-2-3, а в другом 2-1-3 сделали ?