删除移动构造函数时进行支撑初始化



这可能不是C++20特有的,但我现在正在使用它。我有一个简单的结构

struct foo {
int bar;
}

可以声明和初始化为

const auto baz = foo{42};

现在,当我禁用移动构造函数(foo(foo&&) = delete;(时,的上述初始化失败

错误:调用"foo::foo(("时没有匹配的函数

出现此错误的原因是什么?有没有办法恢复默认行为?

它特定于C++20。由于C++20,如果类存在任何用户声明的构造函数,即使它只是默认或删除的,它也不再聚合。聚合初始化将不再工作。

这是一个破坏向后兼容性的更改,您无法真正恢复以前的行为。您将不得不根据更改调整您的代码。

如果你想禁用移动构造函数,你需要添加一个合适的构造函数来进行初始化,即以int为参数并用它初始化bar,这样你就不能再依赖聚合初始化了。或者,您可以添加一个具有默认初始值设定项的不可移动成员作为类的最后一个成员。然后,它将不需要在聚合初始化中提供初始值设定项,但会使整个类不可移动。

然而,有点令人惊讶的是,您需要手动禁用move构造函数。如果该类在没有任何声明构造函数的情况下进行聚合,则当且仅当其所有内容都是可移动的时,该类才是可移动。这通常应该是预期的行为,因为聚合类只是将单个成员聚集在一起,而不添加任何其他类不变量。

相关内容

  • 没有找到相关文章

最新更新