在std :: initializer_list的构造函数的参数列表中的折叠与“正常”折叠

考瓦尔斯基

我从Jacek Galowicz的C ++ 17 STL Cookbook中学习了C ++ 17,并且有一个关于lambdas的例子:

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (void)std::initializer_list<int>{((void)functions(x), 0)...}; };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (void)std::initializer_list<int>{((void)f(xs), 0)...};
}

static auto brace_print(char a, char b)
{
    return [=](auto x) { std::cout << a << x << b << ", "; };
}

int main()
{
    auto f(brace_print('(', ')'));
    auto g(brace_print('[', ']'));
    auto h(brace_print('{', '}'));
    auto nl([](auto) { std::cout << '\n'; });

    auto call_fgh(multicall(f, g, h, nl));

    for_each(call_fgh, 1, 2, 3, 4, 5);
}

为什么在std::initializer_list这里使用了为什么?为什么要使用这种void转换(作者写道,应该reinterpret_cast使用C而不是类似C的转换,但是问题是为什么要使用这种转换)?

当我将multicallfor_each函数更改为

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (functions(x), ...); };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (f(xs), ...);
}

一切都按预期进行,我得到相同的结果。

德米特里·戈登

出于某些原因,本书的这一部分似乎采用C ++ 14方式。std::initializer_list在C ++ 17中引入折叠表达式以调用模拟可变参数调用之前,需要使用技巧在C ++ 17中使用逗号运算符折叠绝对合法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: initializer_list构造函数

构造函数中的std :: initializer_list转换

std :: initializer_list作为模板类中的构造函数参数

使用std :: initializer_list构造函数而不会产生歧义?

如何编写正确的std :: initializer_list构造函数

数组vs std :: initializer_list作为函数参数

使用std :: initializer_list参数的非成员函数(/非构造函数上下文)的重载解析

为什么使用带括号的初始化程序列表时首选std :: initializer_list构造函数?

如何不使用std :: initializer_list定义初始值设定项列表构造函数?

采用 std::initializer_list 的构造函数优于其他构造函数

如何使用std :: initializer_list <double>构造一个构造函数

无法从std :: initializer_list <int>构造std :: initializer_list <int const>

在clang中返回std :: initializer_list

std :: initializer_list构造函数和“初始化初始化”问题

显式构造函数和std :: initializer_list初始化

如何检查类型'T'是否具有'T(std :: initializer_list <U>)'构造函数

为c样式的字符串创建std :: initializer_list构造函数

如何使用带有std :: initializer_list的构造函数设计类?

C ++构造函数采用大小为一的std :: initializer_list

C ++-std :: initializer_list与std :: span

是否可以以编程方式构造std :: initializer_list?

从initializer_list错误构造一个std :: map

std :: initializer_list的实现

std :: initializer_list的实现

如何检测模板参数是否为 std::initializer_list

是否可以从函数返回std :: initializer_list?

具有initializer_list和size的std :: unordered_map构造函数在main中进行编译,但在类定义中未进行编译

无法从<括号括起来的初始化程序列表>中推导std :: initializer_list

C ++将std :: initializer_list强制转换为模板化函数中的容器