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

 
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 сделали ?

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

Еще раз повторюсь: как обычная функция означает лишь то (и только то), что оба (левый и правый) вычисляются в любом случае в отличие от этого:

bool f( int i ) { Print( i ); return i; }
void OnStart()
{
    if ( f(0) && f(1) );
}

Результат: 0

т.е. правый не вычисляется вообще

 
A100 #:

Результат: 0

т.е. правый не вычисляется вообще

&& в данном случае никакого отношения не имеет к operator&&. Они только пишутся одинаково.

operator&& - это метод, имеющий удобный синтаксис применения в некоторых ситуациях.
 
fxsaber #:

&& в данном случае никакого отношения не имеет к operator&&. Они только пишутся одинаково.

operator&& - это метод, имеющий удобный синтаксис применения в некоторых ситуациях.

Прямого отношения не имеет, а косвенное имеет. Разберитесь в этом результате и все станет понятно

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