使用折叠表达式填充数组时出现语法问题

Dei*_*Dei 14 c++ fold-expression c++17

是的,我可以使用std::initializer_list.是的,更简单,我可以进行聚合初始化.但这是如何工作的?我似乎无法克服C++ 17的折叠表达式.那里没有足够的例子.

这是我想出的:

template<class T, std::size_t N>
struct foo
{
    T arr[N];

    template<typename... Args>
    constexpr foo(Args&&... pack)
    {
        static_assert(sizeof...(pack) <= N, "Too many args");
        std::size_t i = 0;
        (arr[i++] = ...);
    }
};

int main()
{
    foo<int, 5> a(1, 2, 3, 4, 5);
}
Run Code Online (Sandbox Code Playgroud)

编辑:与最新的Clang编译.支持折叠表达式.

实例: http ://coliru.stacked-crooked.com/a/777dc32da6c54892

T.C*_*.C. 13

您需要使用逗号运算符进行折叠,这也解决了排序问题.

(void(arr[i++] = pack) , ...);
Run Code Online (Sandbox Code Playgroud)

  • 是的,完美的工作.在这种语法不会让我感到困惑之前,还需要一些时间.当其他人写它时,它看起来完全合乎逻辑.:d (2认同)

Vau*_*ato 5

由于逗号运算符是左关联的,因此最好使用左一元折叠:

(...,void(arr[i++] = pack))
Run Code Online (Sandbox Code Playgroud)

强制转换为void是为了确保使用内置逗号运算符。在这种情况下,惯用手实际上并不重要。

  • 没关系。`((a, b), c)` 和 `(a, (b, c))` 都先评估 `a`,然后评估 `b`,然后评估 `c`。 (2认同)