【发布时间】:2021-11-15 17:21:46
【问题描述】:
我在一个游戏的开源实现中找到了以下代码。
struct Renderable {
std::shared_ptr<UniformInput> uniform;
std::shared_ptr<Geometry> geometry;
bool alpha_blending = true;
bool depth_test = true;
};
struct ShaderUpdate : Renderable {
ShaderUpdate(std::shared_ptr<UniformInput> const& uniform)
: Renderable{uniform, nullptr} {}
ShaderUpdate(std::shared_ptr<UniformInput> && uniform)
: Renderable{std::move(uniform), nullptr} {}
};
ShaderUpdate 继承自 'Renderable' 并在对象创建期间调用其基类构造函数。但是“Renderable”没有定义 2 参数构造函数。结构中“初始化”值的存在与此有关吗?
【问题讨论】:
-
使用大括号而不是圆括号很重要。搜索“统一初始化”。
-
换句话说,
Renderable没有定义 2 参数构造函数或任何构造函数是完全可以的,因为ShaderUpdate没有调用Renderable的任何构造函数.花括号确实 not 表示调用构造函数。 -
我花了一些时间来解决这个问题。这种形式的初始化列表称为Aggregate Initialization。不过,这样的构造感觉很可疑……我更喜欢定义适当的构造函数而不是这样做。 @molbdnilo,MikeNakis 你会推荐它吗?我读到这解决了 C++11 之前的初始化中的歧义。