【问题标题】:Does the operand to a fold expression need to be parenthesized?折叠表达式的操作数是否需要加括号?
【发布时间】:2021-01-19 16:12:24
【问题描述】:

以下program

#include<iostream>

auto f(auto ...args) 
{
    (std::cout << 1 << ... << args);
}

int main()
{
    f(0, 0, 0);
}

gcc 打印 1000,但 clang 给出错误:

error: expression not permitted as operand of fold expression
    (std::cout << 1 << ... << args);
     ~~~~~~~~~~^~~~
     (            )

我不确定我是否理解错误。像这样添加括号:

((std::cout << 1) << ... << args);

似乎仍然是一个表达式,但现在 clang 也接受了它,并且还打印了 1000

另外,fauto 参数无关紧要,c++17 编写的等效程序具有相同的行为(如演示所示)。

那么这个程序有效吗?

【问题讨论】:

    标签: c++ language-lawyer fold-expression


    【解决方案1】:

    折叠表达式([expr.prim.fold])的语法是:

    折叠表达式

    ( cast-expression fold-operator ... )
    ( ... fold-operator cast-expression )
    ( cast-expression fold-operator ... fold-operator 演员表 )

    您使用的是第三种形式。你想被解析为第一个 cast-expression 的是一个 shift-expression ([expr.shift]),但是一个 shift-expression 不是 cast-expression,所以这不是一个有效的 fold-expression

    也就是说,a &gt;&gt; b 的优先级低于(T) c,这是折叠表达式可以接受的最低优先级形式。这是因为下一个最高的是指向成员的表达式,它本身就是可能的折叠运算符之一,因此它可能是模棱两可的。

    【讨论】:

    • 这是有道理的。那么可能只是一个 gcc 错误。它确实抱怨其他运营商。
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多