在以下示例中,我不明白为什么赋值运算符中的参数使用复制构造函数而不是要构建的移动构造函数
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 +
在以“特殊”方式实现时才是右值,所以呢?