元操作符...
的优先级是什么,其作用是解压缩模板类型参数包?我想它很低,但它有多低? C ++标准说:
运算符的优先级不是直接指定的,但可以从语法中派生出来。
任何人都可以接受挑战?当然,...
不会出现在C ++ 03运算符优先级表中。
好的,如果...
不是运营商,那么究竟是什么原因确定std::forward<Args>(args)...
适用于整个序列std::forward<Args>(args)
,而不仅仅是(args)
?
答案 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-expression或braced-init-list。
这就是说,省略号的语法优先级低于任何实际的算子,所以例如以下是等价的:
foo(args ^= 0x1234...) and foo((args ^= 0x1234)...)
foo(x ? args : 42...) and foo((x ? args : 42)...)