元操作符..的优先级是什么?

What is the precedence of the meta-operator ...?

本文关键字:是什么 优先级 操作符      更新时间:2023-10-16

用于解包模板类型参数包的元操作符...的优先级是多少?我想应该很低,但到底有多低呢?c++标准规定:

操作符的优先级没有直接指定,但可以从语法中派生。

有人愿意接受挑战吗?当然,...不会出现在c++ 03的运算符优先级表中。


好吧,如果...不是一个运算符,那么究竟是什么决定了std::forward<Args>(args)...适用于整个序列std::forward<Args>(args),而不仅仅是(args) ?

这似乎不是操作符。来自N3092(抱歉我手头没有更近的草稿)

[14.5.3] 4/一个包扩展是一个序列的令牌,命名一个或更多参数包,后面跟着省略号。令牌序列称为模式的扩张;它的语法取决于扩容发生的环境。包扩展可以发生在以下上下文:

  • 在一个初始化列表(8.5);模式是initializer-clause。
  • 在base- specific -list中(10);模式是一个基本说明符。
  • 在mem-initializer-list中(12.6.2);模式是mem-initializer。
  • 在模板参数列表中(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
    }
    

根据方便的超链接c++ BNF语法,函数调用看起来像这样:

postfix-expression (expression-listopt)

expression-list只是一个初始化列表,它看起来像这样:

initializer-clause…<子>选择
opt

,其中的省略号是包展开符号。

初始化子句可以是赋值表达式带括号的初始化列表

这就是说,省略号在语法上的优先级比任何实际的操作符都低,因此,例如以下语句是等价的:
foo(args ^= 0x1234...) and foo((args ^= 0x1234)...)
foo(x ? args : 42...) and foo((x ? args : 42)...)