7

...テンプレート型のパラメーター パックを展開するメタオペレーターの優先順位は? かなり低いと思いますが、どのくらいですか?C++ 標準は次のように述べています。

演算子の優先順位は直接指定されていませんが、構文から導き出すことができます。

挑戦する人はいますか?もちろん、...C++03 演算子の優先順位表には表示されません。


では、 が演算子ではない場合、たとえばだけでなく、シーケンス全体に適用される...ことを正確に決定するものは何ですか?std::forward<Args>(args)...std::forward<Args>(args)(args)

4

2 に答える 2

5

オペレーターではないようです。N3092 より (最新のドラフトが手元になくて申し訳ありません)

[14.5.3] 4/ パック展開は、1 つまたは複数のパラメーター パックを指定するトークンのシーケンスであり、その後に省略記号が続きます。トークンのシーケンスは展開のパターンと呼ばれます。その構文は、展開が発生するコンテキストによって異なります。パック拡張は、次のコンテキストで発生する可能性があります。

  • 初期化子リスト (8.5); パターンは初期化句です。
  • base-specifier-list (10); パターンは base-specifier です。
  • mem-initializer-list (12.6.2); パターンは mem-initializer です。
  • template-argument-list (14.3); パターンはテンプレート引数です。
  • 動的例外仕様 (15.4)。パターンはタイプ ID です。
  • 属性リスト (7.6.1); パターンは属性です。
  • キャプチャリスト (5.1.2); パターンはキャプチャです。[例:

    template<class ... Types> void f(Types ... rest);
    template<class ... Types> void g(Types ... rest) {
        f(&rest ...); // “&amp;rest ...” is a pack expansion; “&amp;rest” is its pattern
    }
    

    — 最後の例]

于 2011-08-12T16:20:39.450 に答える
1

便利なHyperlinked C++ BNF Grammarによると、関数呼び出しは次のようになります。

後置式 (式リストのオプション)

expression-listは単なるinitializer-listであり、次のようになります。

初期化節 ... opt
初期化リスト , 初期化節 ... opt

ここで、省略記号はパック展開表記です。

initializer-clauseは、代入式または波括弧初期化リストのいずれかにすることができます。

つまり、省略記号は実際の演算子よりも文法上の優先順位が低いということです。たとえば、次の演算子は同等です。

foo(args ^= 0x1234...) and foo((args ^= 0x1234)...)

foo(x ? args : 42...) and foo((x ? args : 42)...) 
于 2011-08-13T10:44:14.387 に答える