c++ - 结构类型 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++17 开始,聚合可以有基类。所以既然Print
继承自Ts..
做
Print<Ts...>{ts...}
创建一个Print
对象并使用每个基类的实例初始化所有基类。查看一个扩展的简单示例,您的代码基本上与
struct foo
{
int f;
};
struct bar : foo {};
int main()
{
foo f{42};
bar b{f};
}
其中b
的foo
部分由 初始化f
。
推荐阅读
- api - Google Vision API - 对我存储桶中的文件的访问被拒绝
- c++ - 通过 DLL/SO 边界传递异常
- python - 为什么每次单击提交按钮时都会刷新我的网页和烧瓶
- html - 对元素进行更改
- c++ - 设置控制台窗口大小并删除滚动条
- django - 如何访问modelforms中的html名称而不是django中的模型名称
- javascript - vue.js - 从对象获取和显示所需值的问题 - onclick
- html - 如何防止 flex 对象溢出它的容器?
- swift - SwiftUI - nil 不是用于搜索实体名称的合法 NSPersistentStoreCoordinator
- java - 用另一个数组中的元素替换几乎排序的数组中的元素