元运算符的优先级是什么?

时间:2011-08-12 15:56:19

标签: c++ c++11 operator-precedence ellipsis variadic-templates

元操作符...的优先级是什么,其作用是解压缩模板类型参数包?我想它很低,但它有多低? C ++标准说:

  

运算符的优先级不是直接指定的,但可以从语法中派生出来。

任何人都可以接受挑战?当然,...不会出现在C ++ 03运算符优先级表中。


好的,如果...不是运营商,那么究竟是什么原因确定std::forward<Args>(args)...适用于整个序列std::forward<Args>(args),而不仅仅是(args)

2 个答案:

答案 0 :(得分:5)

它似乎不是一个运营商。从N3092开始(抱歉,我没有最近的草稿)

  

[14.5.3] 4 /包扩展是一系列令牌,命名一个或   更多参数包,后跟省略号。令牌序列   被称为扩张的模式;它的语法取决于   发生扩张的背景。包扩展可以在   以下情况:

     
      
  • 在初始化列表中(8.5);模式是一个   初始化子句。
  •   
  • 在base-specifier-list(10)中;模式是基本说明符。
  •   
  • 在mem-initializer-list(12.6.2)中;模式是一个   MEM-初始化。
  •   
  • 在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 ...); // “&rest ...” is a pack expansion; “&rest” is its pattern
    }
    
         

    - 结束示例]

  •   

答案 1 :(得分:1)

根据方便的Hyperlinked C++ BNF Grammar,函数调用如下所示:

  

postfix-expression(expression-list opt

表达式列表只是一个initializer-list,如下所示:

  

initializer-clause ... opt
    initializer-list,initializer-clause ... opt

其中省略号是包扩展符号。

反过来,

initializer-clause 可以是assignment-expressionbraced-init-list

这就是说,省略号的语法优先级低于任何实际的算子,所以例如以下是等价的:

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

foo(x ? args : 42...) and foo((x ? args : 42)...)