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

时间:2018-02-07 10:15:05

标签: c++ lambda multiple-inheritance template-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函数作为struct overloaded的基类。第一行将lambda的operator()拉入结构的范围。第二行使用class template argument deduction guides(C ++ 17)。

问题

我不理解{ }之后使用overloaded括号的第3行。

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

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

1 个答案:

答案 0 :(得分:5)

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