【发布时间】:2017-05-18 13:30:23
【问题描述】:
我在C++编程语言中看到一句话让我很困惑:
• 如果程序员为类声明了复制操作、移动操作或析构函数,则不会为该类生成复制操作、移动操作或析构函数。
我写了如下所示的测试代码:
#include <iostream>
using namespace std;
class A
{
public:
A() :a(0){}
A(int _a) :a(_a){}
int get() const
{
return a;
}
/*A& operator=(const A &x)
{
a = x.a;
cout << "A copy assignment" << endl;
return *this;
}*/
A& operator=(A&&x)
{
cout << "A move assignment" << endl;
swap(a, x.a);
return *this;
}
private:
int a;
};
A operator+(const A &x, const A &y)
{
A temp{ x.get() + y.get() };
return temp;
}
int main()
{
A a1(1), a2(2), a3;
a3 = a1;
cout << a3.get() << endl;
return 0;
}
我定义了一个move assignment,应该不会像书中说的那样生成默认的copy assignment,但是a3怎么会得到a1的copy呢?
另一个问题:
我修改了a3赋值表达式:
a3 = a1+a2;
然后我注释掉移动分配并删除复制分配的注释:
A& operator=(const A &x)
{
a = x.a;
cout << "A copy assignment" << endl;
return *this;
}
/*
A& operator=(A&&x)
{
cout << "A move assignment" << endl;
swap(a, x.a);
return *this;
}*/
如何调用复制分配? a1+a2的结果是一个右值,这个右值怎么能传给参数为const A&的copy assignment呢?原谅我对右值的困惑
感谢任何帮助!
【问题讨论】:
-
这不是一个包罗万象的声明。
-
一个 const 引用总是能够绑定到一个右值。
-
另外,您使用的是什么编译器?这无法使用 g++ 编译:coliru.stacked-crooked.com/a/691550b52fcb5af9
-
重要提示:此 C++ 编程语言引用的意思是: 1. 如果您指定复制构造函数/操作符,则不会自动生成任何内容。 2.如果你指定一个移动构造函数/操作符,将不会自动生成。 3.如果你指定一个默认构造函数,将不会生成其他默认构造函数。 4. 如果指定析构函数,则不会自动生成其他析构函数。书中的语句只是单个语句的不幸压缩。
-
@NathanOliver,我在 VS2013 中编译了这段代码
标签: c++ copy-assignment move-assignment-operator