首页 > 解决方案 > 结构类型 A{a, b, c} 之后的括号元素含义

问题描述

在结构类型之后在括号内传递对象意味着什么时候它不引用结构属性或它自己的构造函数的参数。

template <class... Ts> // (1)
struct Print : Ts... {
    using Ts::operator()...;
};

template <class... Ts> // (1)
auto MakePrint(Ts... ts) {
    return Print<Ts...>{ts...};
}

ts...最后一行中,在没有它的情况下运行此代码会产生完全相同的结果,但我不明白它为什么会编译:s

我知道使用括号的唯一两种解释是设置结构的属性或调用结构的构造函数

但在这种情况下,例如:

auto m = MakePrint ([](int i){ return i + 1;});

它相当于:

auto MakePrint (typeof(lambda) lambda) {
   return Print<typeof(lambda)>{lambda};
}

和 Print 以下列方式定义:

struct Print : typeof(lambda) {
    auto operator() (int i) { return i + 1; }
}

那么括号(return Print<typeof(lambda)>{lambda};)内的对象 lambda 去哪里了?

标签: c++c++17

解决方案


从 C++17 开始,聚合可以有基类。所以既然Print继承自Ts..

Print<Ts...>{ts...}

创建一个Print对象并使用每个基类的实例初始化所有基类。查看一个扩展的简单示例,您的代码基本上与

struct foo
{
    int f;
};

struct bar : foo {};

int main()
{
    foo f{42};
    bar b{f};
}

其中bfoo部分由 初始化f


推荐阅读