Подтвердить что ты не робот

Короткое замыкание перегруженного оператора && и || в С++ 17

Я читал в http://en.cppreference.com/w/cpp/language/operators:

Логические логические операторы, оператор && и оператор ||

В отличие от встроенные версии, перегрузки не упорядочивают их левый операнд не может реализовать короткое замыкание оценка.

(Мой акцент).

Не удалось найти какой-либо ресурс или пример кода для С++ 17, поддерживающего короткое замыкание для оператора && и оператора ||. Связано ли это с выражением сложения пакета параметров С++ 17? пытался играть с ним, но не мог создать поведение короткого замыкания для перегруженного оператора && & и || с 17-кратным выражением С++.

код:

class A {
    bool val;
public:
    A(bool b) : val(b) { cout << "A born as " << boolalpha << val << endl;}
    template<typename ...Args>
    bool operator&&(Args&&... args) {
        return (val && ... && args.val);
    }    
};

int main() {
    cout << boolalpha;
    cout << ( A{false} && A{true} ) << endl;
    cout << ( A{true} && A{false} ) << endl;
    cout << ( A{false} && A{false} ) << endl;
}

Вывод:

A born as true
A born as false
false
A born as false
A born as true
false
A born as false
A born as false
false

http://coliru.stacked-crooked.com/a/f0b5325899c2fe6b

Примечание: последовательность слева направо также не происходит в текущей версии gcc, скомпилированной с флагом С++ 17.

4b9b3361

Ответ 1

Это утверждение не касается оценки короткого замыкания. Это о порядке оценки операндов.

Pre-С++ 17, порядок оценки операндов перегруженных && & и || был определен компилятором. С++ 17 определяет явный порядок оценки слева направо для && & и ||, независимо от того, перегружены они или нет.

Оценка короткого замыкания применима только к встроенным операторам.

Обратите внимание, что на фактической странице, которую вы указали, выделенная часть - это то, что применяется к конкретной версии. Эта часть касается порядка упорядочения, а не части оценки короткого замыкания.