C++17 使用模板参数推导指南继承 lambda 集

标签 c++ lambda multiple-inheritance template-argument-deduction c++17

我在看关于 std::variant 的文章 http://en.cppreference.com/w/cpp/utility/variant/visit

该示例主要包含以下几行(由我略微修改):

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

auto a = overloaded {
            [](auto arg) { std::cout << arg << ' '; },
            [](double arg) { std::cout << std::fixed << arg << ' '; },
            [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
           };

代码基本上使用列表中的每个 lambda 函数作为结构 重载 的基类。第一行将 lambda 的 operator() 拉入结构的范围。第二行使用class template argument deduction guides (C++17)。

问题

我不明白在 overloaded 之后使用 { } 大括号的第 3 行。

这里使用什么样的 C++ 机制? 我们是使用初始化列表并将其转换为可变模板参数,还是一种统一/聚合初始化?此行中是否调用了任何实际的构造函数?

有趣的是,如果我使用 ( ),构造会失败。

最佳答案

aggregate initialization ,特别是结果类型的直接公共(public)基础。自 C++17 起,基础子对象本身不必是聚合,它们是从初始化列表的元素复制初始化的。

关于C++17 使用模板参数推导指南继承 lambda 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661148/

相关文章:

c++ - 好友声明 : Is this a bug in clang?

当派生类是最终的时,C++ 虚函数内联?

java - C++ 与 Java 中的多重继承

c++ - 为什么 memcpy/memmove 在将 int 复制到字节缓冲区时反转数据?

c++ - 如何保护非托管应用程序中的字符串免受进程转储

list - 从嵌套列表中提取有序(根据值)集合,基于列表的最后一项,Java

amazon-web-services - 将相同的 Cognito 用户池与 Lambda 函数和资源一起使用?

python - 使用 lambda :None function as a namespace? 的优势

c++ - 在可变参数模板中使用声明

typescript 多重继承