C 17继承了带有模板参数扣除指南的Lambdas集

C++17 Inheriting set of lambdas with template argument deduction guides

本文关键字:Lambdas 参数 继承      更新时间:2023-10-16

我正在查看std::variant http://en.cppreference.com/w/cpp/utility/variant/visit/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函数用作结构overloaded的基类。第一行将Lambda的operator()拉入结构范围。第二行使用类模板参数扣除指南(C 17(。

问题

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

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

有趣的是,如果我使用( )

它是汇总初始化,特别是所得类型的直接公共基础。由于C 17,因此基本子对象不必是汇总本身,因此它们是从启动器列表的元素初始化的。