2016-12-19 28 views
11

czytałem w http://en.cppreference.com/w/cpp/language/operators:Zwarcie przeciążonego operatora && i || W C++ 17

operatorów logicznych logicznych, operatora & & i operator ||

przeciwieństwie do wbudowany w wersjach przeciążenia nie sekwencjonowania ich lewy operand przed prawą, a (do C++ 17) nie może implementować zwierać ocenę.

(Mój nacisk).

Nie można znaleźć żadnego zasobu lub kodu przykładowego dla C++ 17 obsługującego zwarcie dla operatora & & i operatora ||. Czy jest to związane z wyrażeniem krotności pakunku parametrów C++ 17? próbował grać, ale nie mógł wywołać zwarcia w przypadku przeciążonego operatora: & & i || z 17-krotnym wyrażeniem C++.

Kod:

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; 
} 

wyjściowa:

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

Uwaga: sekwencja od lewej do prawej strony nie jest też dzieje się w aktualnej wersji gcc, skompilowane z C++ 17 flaga.

+0

Pokaż, co próbujesz, ale nie działa. Być może możesz wybrać odpowiedni kompilator i wersję [tutaj] (https://godbolt.org/) i opublikować link. – wally

+0

* Nie można utworzyć zachowania zwarcia * Jaki był błąd? Czy nie było żadnego błędu i czy pojawiły się efekty uboczne, które przejawiały się u dalszych operatorów? A może przejrzałeś kod i wkroczył on w innych operatorów? – wally

+1

@Mus Pytanie dotyczy zachowania zdefiniowanego w standardzie, a nie kodu, który nie działa. – interjay

Odpowiedz

10

Oświadczenie to nie dotyczy oceny zwarć. Chodzi o kolejność oceny operandów.

Pre-C++ 17, kolejność oceny operandów przeciążonych: & & i || był zdefiniowany przez kompilator. C++ 17 definiuje jawną kolejność oceny od lewej do prawej dla & & i ||, bez względu na to, czy są przeciążone, czy nie.

Ocena zwarcia dotyczy tylko wbudowanych operatorów.

Należy zauważyć, że na aktualnie cytowanej stronie wyróżniona część jest stosowana do określonej wersji. Ta część dotyczy kolejności kolejności, a nie części dotyczącej oceny zwarć.

+3

To niefortunne umieszczenie tag "until C++ 17". Edytowałem stronę, aby gramatyka była wyraźniejsza. – user2357112

+4

@ user2357112: Osobiście wydaje się dobrze, o ile wiesz, że wszystkie znaczniki specyficzne dla wersji mają zastosowanie tylko do tekstu w pudełku, który je zawiera. –

+0

Oczywiście nie wszyscy to wiedzą, a niedopasowanie gramatyki angielskiej do wersji-boxa może spowodować, że ktoś, kto wie, jak działają skrzynki wersji. – user2357112

Powiązane problemy