2016-12-19 7 views
11

に私がhttp://en.cppreference.com/w/cpp/language/operatorsで読む:オーバーロードされた演算子&&と||の短絡C++ 17

ブール論理演算子、オペレーター& &とオペレータ|| (C++ 17時まで)

内蔵のバージョン とは異なり、オーバーロードは、右1の前に自分の左オペランド の配列を決定し、ませんは短絡 評価を実装することはできません。

(私の強調)。

は||オペレータ& &とオペレータに対して短絡 をサポートするC++ 17のための任意のリソースまたはコード例を見つけることができませんでした。 C++ 17のパラメータパックの折り畳み式に関連していますか?それを再生しようとしましたが、過負荷のオペレータの短絡動作を作成できませんでした& &と|| C++は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のバージョンでは起きていない、C++ 17でコンパイルさフラグ。

+0

あなたが試したことがうまくいかなかったことを示してください。おそらく、[ここ](https://godbolt.org/)で使用したコンパイラとバージョンを選択してリンクを投稿することができます。 – wally

+0

*短絡動作を作成できませんでした。*エラーは何ですか?または、エラーはなく、下流側のオペレータのために自分自身を展示した副作用がありましたか?または、コードをステップ実行して、他の演算子にステップインしましたか? – wally

+1

@Mus問題は、標準で定義されている動作についてであり、動作しないコードについてではありません。 – interjay

答えて

10

この文は、短絡の評価に関するものではありません。これは、オペランドを評価する順序です。

Pre-C++ 17、オーバーロードされたオペランドを評価する順序& &および||コンパイラによって定義されました。 C++ 17は、オーバーロードされているかどうかにかかわらず、左から右への評価の明示的な順序を& &と||で定義しています。

短絡の評価は、組み込み演算子にのみ適用されます。

あなたが実際に引用したページでは、強調表示されている部分が特定のバージョンに適用されていることに注意してください。その部分は、短絡評価に関する部分ではなく、順序付けの順序に関するものです。

+3

これは残念ながら"〜までC++ 17"タグ。私は文法をより明確にするためにページを編集しました。 – user2357112

+4

@ user2357112:個人的には、すべてのバージョン固有のタグは、それらを含むボックスのテキストにのみ適用されることがわかっている限り、個人的にはうまくいくようです。 –

+0

もちろん、誰もがそれを知っているわけではなく、英語の文法とバージョンボックスの不一致は、バージョンボックスの仕組みを知っている人を捨てることができます。 – user2357112

関連する問題