【问题标题】:C++17 Inheriting set of lambdas with template argument deduction guidesC++17 使用模板参数推导指南继承 lambda 集
【发布时间】:2018-07-17 14:04:23
【问题描述】:

我在看std::varianthttp://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 的基类。第一行将 lambda 的 operator() 拉到结构的范围内。第二行使用class template argument deduction guides (C++17)。

问题

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

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

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

【问题讨论】:

  • 自 C++11 起检查聚合初始化

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多