2016-07-11 3 views
5

http://en.cppreference.com/w/cpp/language/foldのウェブサイトは、倍概念を使用する方法の例を示し、それは言う:C++ 17:「折りたたみ」の概念で「キャスト下の優先順位を持つ演算子」は何を意味していますか?

has an operator with precedence below cast at the top level 
:私は文を入手終了していない、非英語のネイティブスピーカーとして

実際にはどういう意味ですか、それは例で何を示していますか? これを説明するのに役立つでしょうか?

ありがとうございます。

+3

を得るでしょうそれは、[優先順位表]の行3以下のものを意味します(http://en.cppreference.com/w/cpp/language/operator_precedence )。 –

答えて

7

キャスト演算子((Typename)expr)の優先順位は、C++'s operator precedence rulesです。優先順位の高い演算子はごくわずかです。キャストレベル以上の演算子は非常に特殊な演算で、通常は単一の式に適用されます。

args + ... + 1 * 2では、...は、左右のすべてに適用されます。しかし、「正しい」とはどういう意味ですか? + 1の部分だけを意味するのですか、それとも+ 1 * 2を意味しますか?

優先度の高い演算子の場合は、その意図が何であるかはっきりしています。たとえば、args + ... + func()の場合、()ファンクションコール演算子はfuncに適用され、args + ... + funcに適用されないことは明らかです。後者の場合は、((args + ... + func)())した場合に、かっこを明示的に使用することを余儀なくされることはあまりありません。

しかし、グラフの3より下の優先度については、人々は理解しにくいものになります。そのため、通常の優先順位規則を使用する代わりに、C++はユーザーに明示的に指示します。 args + ... + (1 * 2)または(args + ... + 1) * 2にすることができます。しかし、あなたはあなたが望むものを明確にする必要があります。

+0

あなたの説明は私には明らかです。 –

+1

fold式は '(exp1 op ... op exp2)'ですので、実際の解析のあいまいさがあるのではないかと思います。コンパイラだけではなく、人間にとっても明らかなことでしょう。 –

1

これは、複数の演算子を持つ式があいまいである場合、キャスト演算子の前に "キャスト"より上位の演算子が呼び出され、キャスト演算子の後に "キャストよりも下位の演算子が呼び出されます。 2 + 2 * 2乗算のようにのは、お互いにキャスト可能です以下の二つのクラスについて考えてみましょう6をその結果、添加の前に実行されますが、いない8

する必要があります。

class E2; 

class E1 { 
public: 

    operator E2(); 

    E1 operator++(int) { 
    std::cout << "E1 Post-inc\n"; 
    return *this; 
    } 

    E1 operator*(const E1&) { 
    std::cout << "E1 * E1\n"; 
    return *this; 
    } 
}; 

class E2 { 
public: 

    operator E1() { 
    std::cout << "Cast E1 -> E2\n"; 
    return E1(); 
    } 

    E2 operator++(int) { 
    std::cout << "E2 Post-inc\n"; 
    return *this; 
    } 

    E2 operator*(const E2&) { 
    std::cout << "E2 * E2\n"; 
    return *this; 
    } 
}; 

E1::operator E2() { 
    std::cout << "Cast E2 -> E1\n"; 
    return E2(); 
} 

をその後のは

E1 e1; 
E2 e2; 
を宣言してみましょう

とdo

(E1)e2++; 

E1とE2の両方にoperatまたは++なので、この式で最初に実行する必要があるのは、キャストまたはインクリメントですか?我々は(コードでの出現順に)3つのアクションを持っている。ここ

e1 * (E1)e2++; 

Precedence table最初に行うべきでインクリメント答え、そのプログラムを印刷

その後
E2 Post-inc 
Cast E1 -> E2 

、のは、より複雑な例を試してみましょう:乗算、キャスト、インクリメント。実行があれば何を注文するのですか?Precedenceテーブルでは、増分が1番目、キャストが2番目(増分以下)、乗算が最後であることが示されています。出力は次のようになります。

E2 Post-inc 
Cast E1 -> E2 
E1 * E1 

括弧を使用して操作を簡単に並べ替えることができます。我々は(e1 * (E1)e2)++;e1 * (E1)e2++;を置き換えた場合、我々は

Cast E1 -> E2 
E1 * E1 
E1 Post-inc 
+0

良い答え、ありがとう! –

関連する問題