5.15 Логический оператор ИЛИ в стандарте говорит следующее:
В отличие от |, || гарантирует оценку слева направо;
Означает ли это, что где-то я не могу найти в стандарте, |
определен для оценки справа налево или что он определяется реализацией? Изменяется ли это, когда оператор перегружен? Я написал быструю программу, чтобы проверить это, и MSVC++, и GCC, кажется, оценивают справа налево.
#include<iostream>
using namespace std;
int foo = 7;
class Bar {
public:
Bar& operator|(Bar& other) {
return *this;
}
Bar& operator++() {
foo += 2;
return *this;
}
Bar& operator--() {
foo *= 2;
return *this;
}
};
int main(int argc, char** argv) {
Bar a;
Bar b;
Bar c = ++a | --b;
cout << foo;
}
Это выводит 16
. Если ++a
и --b
перепутаны, выводится 19
.
Я также подумал, что могу столкнуться с множественными изменениями между правилом точек последовательности (и, следовательно, с неопределенным поведением), но я не уверен, как/если это применимо к двум отдельным экземплярам в качестве операндов.
a
иb
являются разными экземплярами, они оба относятся к одному и тому жеfoo
, поэтому вы действительно вызываете неопределенное поведение, поскольку вы записываете одну и ту же переменную несколько раз без промежуточной точки последовательности. - person Matthieu M.   schedule 25.08.2011