GCC 以错误的方式解包(我<...)折叠表达式
GCC unpacks (I < ...) fold expression the wrong way
我已经向GCC打开了一个错误,但我想知道我的期望是否正确。
考虑此建议和以下折叠表达式:
(args < ...)
它应该等效于:
((args$0 < args$1) < ...) < args$n
请考虑以下代码:
#include <cassert>
int main() {
assert((0 < 42) < 3);
}
断言编译并正常工作,它不会失败(正如预期的那样,请注意结果不是((0 <42)和(42 <3)),表达式本身非常不寻常且毫无意义)。
另一方面,当使用折叠表达式时:
template<int... I>
static constexpr bool f() {
return (I < ...);
}
int main() {
static_assert(f<0, 42, 3>(), "!");
}
断言在编译时失败 (GCC 6.1.0)。
我希望它能够编译,因为提案中包含的内容。
它应该成功,因为它等效于上面不涉及折叠表达式的示例。
解压缩的表达式确实应该是:((0 <42) <3)。
我是对的还是我在这里错过了一些关于折叠表达式的重要内容?
N4191是最初的提案。GCC 的 C++1z 状态页面指出,它在 N4295 中实施了修订后的提案。
左右折叠的规则发生了变化,我相信您的代码现在需要生成右折叠,即 0 < (42 < 3)
,这是false
。
I < ...
是右折; ... < I
将是左折。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 呼叫运营商<<临时
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- <<操作员在下面的行中工作
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 1<<31产生误差;'<<'表达式未定义”;