【发布时间】:2013-04-02 08:03:02
【问题描述】:
在下面的例子中我不明白为什么赋值运算符中的参数使用复制构造函数而不是要构建的移动构造函数
struct Foo
{
int data;
Foo()
{
static int cpt = 1;
data = cpt++;
std::cout << "Foo\n";
}
Foo(const Foo& foo)
{
std::cout << "const Foo&\n";
data = foo.data;
}
Foo(Foo&& foo)
{
std::cout << "Foo&&\n";
data = foo.data;
foo.data = 0;
}
Foo& operator= (Foo foo) //<--- call the copy ctor and not the move ctor as I expected
{
data = foo.data;
std::cout << "operator=\n";
return *this;
}
Foo& operator+ (const Foo& foo)
{
data += foo.data;
return *this;
}
};
int main()
{
Foo f;
Foo f1;
Foo f3;
f3 = f + f1;
std::cout << f3.data;
std::cin.ignore();
return 1;
}
输出:
Foo
Foo
Foo
const Foo&
operator=
3
编译器:MSVCS2012 CTP
编辑:
"但是如果你说 a = x + y,移动构造函数会初始化那个 (因为表达式 x + y 是一个右值)..."
但事实上 x + y 只有在 operator + 以“特殊”方式实现时才是右值,所以?
【问题讨论】:
-
回答“但实际上 x + y 只有在 operator + 以“特殊”方式实现时才为右值,所以?”:是的,没错。请参阅我的回答,特别是使用
bar及其两个运算符 + 和 - 的代码。
标签: c++ c++11 move-semantics