tow*_*owi 6 c++ copy move implicit c++11
我读过N3291"12.8.(11/15/28)复制和移动类对象class.copy]"纠正隐式声明的移动构造函数
T(T&&)同样,移动分配,使用各自T operator=(T&&)的元素.
例:
struct CopyOnly {
CopyOnly();
CopyOnly(const CopyOnly&);
}; // declaring a copy means no implicit move.
struct Question {
std::vector<int> data_;
CopyOnly copyOnly_;
};
Run Code Online (Sandbox Code Playgroud)
班级 Question
=delete剐,因为非静态数据成员data_是只可复制,但不移动?更新.可以侧面的问题:对于Question q;将std::move(q)仍然有效?复制的后备是否会在那里发生?或者隐式声明的 move-ctor会强制编译器因错误而停止吗?在这里它编译.
更新2.如果我声明move-ctor,编译器为不可移动的数据成员生成什么Question(Question&&) =default?是否然后退回到复制那些?
你读错了.在以下情况下,这会破坏许多C++ 03类
Question getQuestion();
Question q(getQuestion()); // use of deleted move constructor!
Run Code Online (Sandbox Code Playgroud)
相反,FDIS表示将声明移动构造函数iff {没有用户声明{copy constructor,{copy,move}赋值运算符,析构函数}并且隐式声明的移动构造函数不会被定义为已删除 }.
关于更新2.我注意到,如果你明确地默认移动构造函数,它将被条件定义为删除
对于移动构造函数,一个非静态数据成员或直接或虚拟基类,其类型没有移动构造函数,并且不是简单的可复制.
在下文中,移动构造函数将被定义为已删除,因为CopyOnly它不是简单的可复制的.
struct Question
{
std::vector<int> data_;
CopyOnly copyOnly_;
Question(Question&&) = default;
};
Run Code Online (Sandbox Code Playgroud)