移动构造函数和赋值运算符:为什么派生类没有默认值?
为什么没有为派生类创建默认的移动构造函数或赋值运算符?为了证明我的意思;具有此设置代码:
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通读 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.