...
解压模板类型参数包的元操作符的优先级是多少?我想它相当低,但它有多低?C++ 标准说:
运算符的优先级不是直接指定的,但可以从语法中得出。
有人愿意挑战吗?当然,...
不会出现在 C++03 运算符优先级表中。
好吧,如果...
不是运算符,那么究竟是什么决定了它std::forward<Args>(args)...
适用于整个序列std::forward<Args>(args)
而不只是(args)
,例如?
...
解压模板类型参数包的元操作符的优先级是多少?我想它相当低,但它有多低?C++ 标准说:
运算符的优先级不是直接指定的,但可以从语法中得出。
有人愿意挑战吗?当然,...
不会出现在 C++03 运算符优先级表中。
好吧,如果...
不是运算符,那么究竟是什么决定了它std::forward<Args>(args)...
适用于整个序列std::forward<Args>(args)
而不只是(args)
,例如?
好像不是运营商。来自 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 ...); // “&rest ...” is a pack expansion; “&rest” is its pattern }
——结束示例]
根据方便的Hyperlinked C++ BNF Grammar,函数调用如下所示:
后缀表达式(表达式列表选择)
expression-list只是一个初始化列表,如下所示:
初始化子句 ... opt
初始化器列表 , 初始化器子句 ... opt
其中省略号是包扩展符号。
initializer-clause反过来可以是assignment-expression或braced-init-list。
所有这一切都是说,省略号的语法优先级低于任何实际的运算符,因此例如以下是等价的:
foo(args ^= 0x1234...) and foo((args ^= 0x1234)...)
foo(x ? args : 42...) and foo((x ? args : 42)...)