C++17 使用模板参数推导指南继承 lambda 集
C++17 Inheriting set of lambdas with template argument deduction guides
我正在看 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 函数作为结构 overloaded
的基础 class。第一行将 lambda 的 operator()
拉入结构的范围。第二行使用 class template argument deduction guides (C++17).
问题
我不明白第 3 行在 overloaded
之后使用 { }
大括号。
这里使用什么样的 C++ 机制?
我们是使用初始化列表并将其转换为可变模板参数还是一种 uniform/aggregate 初始化?此行中是否调用了任何实际的构造函数?
有趣的是,如果我使用 ( )
.
构建失败
它是 aggregate initialization,特别是结果类型的直接 public 碱基。自 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 函数作为结构 overloaded
的基础 class。第一行将 lambda 的 operator()
拉入结构的范围。第二行使用 class template argument deduction guides (C++17).
问题
我不明白第 3 行在 overloaded
之后使用 { }
大括号。
这里使用什么样的 C++ 机制? 我们是使用初始化列表并将其转换为可变模板参数还是一种 uniform/aggregate 初始化?此行中是否调用了任何实际的构造函数?
有趣的是,如果我使用 ( )
.
它是 aggregate initialization,特别是结果类型的直接 public 碱基。自 C++17 起,基础子对象本身不必是聚合,它们是从初始化列表的元素复制初始化的。