在结构类型A {a,b,c}

时间:2019-04-24 18:40:16

标签: c++ c++17

在struct类型之后在括号内传递对象的含义是什么,当它不引用struct属性或自身构造函数的参数时。

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};
}

和打印是通过以下方式定义的:

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

那么括号内的对象lambda(返回Print<typeof(lambda)>{lambda};)在哪里呢?

1 个答案:

答案 0 :(得分:3)

从C ++ 17开始,聚合可以具有基类。因此,由于Print是从Ts..继承而来的

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

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

相同
struct foo
{
    int f;
};

struct bar : foo {};

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

其中b的{​​{1}}部分由foo初始化。