7

...解压模板类型参数包的元操作符的优先级是多少?我想它相当低,但它有多低?C++ 标准说:

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

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


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

4

2 回答 2

5

好像不是运营商。来自 N3092(抱歉,我手头没有更新的草稿)

[14.5.3] 4/ 包扩展是一系列标记,命名一个或多个参数包,后跟省略号。记号序列称为展开模式;它的语法取决于展开发生的上下文。包扩展可能发生在以下情况下:

  • 在初始化列表(8.5)中;该模式是一个初始化子句。
  • 在基本说明符列表(10)中;模式是一个基本说明符。
  • 在 mem-initializer-list (12.6.2) 中;该模式是一个内存初始化器。
  • 在模板参数列表(14.3)中;该模式是一个模板参数。
  • 在动态异常规范(15.4)中;模式是类型标识。
  • 在属性列表中(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只是一个初始化列表,如下所示:

初始化子句 ... opt
初始化器列表 , 初始化器子句 ... opt

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

initializer-clause反过来可以是assignment-expressionbraced-init-list

所有这一切都是说,省略号的语法优先级低于任何实际的运算符,因此例如以下是等价的:

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

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