移动构造函数和赋值运算符:为什么派生类没有默认值?

发布于 2024-08-29 21:56:52 字数 469 浏览 7 评论 0原文

为什么没有为派生类创建默认的移动构造函数或赋值运算符?为了证明我的意思;具有此设置代码:

#include <utility>

struct A
{
  A () { }
  A (A&&) { throw 0; }
  A& operator= (A&&) { throw 0; }
};

struct B : A
{ };

以下任一行都会抛出:

A  x (std::move (A ());
A  x;  x = A ();

但以下任一行都不会:

B  x (std::move (B ());
B  x;  x = B ();

如果重要的话,我使用 GCC 4.4 进行了测试。

编辑:后来使用 GCC 4.5 进行的测试显示了相同的行为。

Why there is default move constructor or assignment operator not created for derived classes? To demonstrate what I mean; having this setup code:

#include <utility>

struct A
{
  A () { }
  A (A&&) { throw 0; }
  A& operator= (A&&) { throw 0; }
};

struct B : A
{ };

either of the following lines throws:

A  x (std::move (A ());
A  x;  x = A ();

but neither of the following does:

B  x (std::move (B ());
B  x;  x = B ();

In case it matters, I tested with GCC 4.4.

EDIT: Later test with GCC 4.5 showed the same behavior.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七分※倦醒 2024-09-05 21:56:52

通读 0x FCD 中的 12.8(尤其是 move ctor 的 12.8/17),这似乎是一个 GCC 错误。我看到 4.5 中发生的事情与 4.4 中发生的情况相同。

我可能缺少已删除函数的极端情况或类似的情况,但我还没有看到任何迹象。

Reading through 12.8 in the 0x FCD (12.8/17 in particular for the move ctor), this appears to be a GCC bug. I see the same thing happening in 4.5 as you do in 4.4.

I may be missing a corner case on deleted functions, or something similar, but I don't see any indication of that yet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文