【发布时间】:2010-04-22 20:39:49
【问题描述】:
为什么没有为派生类创建默认的移动构造函数或赋值运算符?证明我的意思;有这个设置代码:
#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 进行的测试显示了相同的行为。
【问题讨论】:
-
std::move在这里有什么改变吗?A()不是已经是右值了吗? -
是的,确实如此。否则,C++ 标准允许编译器将其压缩为 just-construct-x(或者我在 freenode.net 上被告知)。我还验证了如果没有
std::move,移动构造函数不会被触发,所以 freenode.net 的评论似乎是正确的。 -
@Mike: Copy elision (12.8/34, 0x FCD) 是一种常见的优化,但是使用 move() 会使这个表达式超出允许的范围。
-
啊,是的,你是对的!因此,从某种意义上说,移动 ctor 需要可访问,它仍然是一个移动,但实际调用被省略了,就像对复制 ctor 的调用一样。感谢您的澄清!
标签: c++ c++11 move-constructor