我读过N3291“12.8。(11/15/28)复制和移动类对象class.copy]”纠正隐式声明的移动构造函数
T(T&&)
同样 move-assign ,使用相应的T operator=(T&&)
元素。
示例:
struct CopyOnly {
CopyOnly();
CopyOnly(const CopyOnly&);
}; // declaring a copy means no implicit move.
struct Question {
std::vector<int> data_;
CopyOnly copyOnly_;
};
班级Question
=delete
d ,因为非静态数据成员data_
仅可复制,但无法移动 ? 更新。一个附带问题:对于Question q;
std::move(q)
还会有效吗?复制的后备是否会在那里发生?或者隐式声明的 move-ctor会强制编译器因错误而停止吗? Here它确实编译。
更新2. 如果我声明move-ctor Question(Question&&) =default
,编译器会为不可移动的数据成员生成什么?是然后回退复制那些?
答案 0 :(得分:5)
你读错了。这会破坏许多C ++ 03类,例如以下
Question getQuestion();
Question q(getQuestion()); // use of deleted move constructor!
相反,FDIS表示将声明一个移动构造函数iff {没有用户声明{copy constructor,{copy,move}赋值运算符,析构函数}和隐式声明的移动构造函数不会被定义为删除}。
关于更新2 。我注意到,如果你明确默认移动构造函数,它将被定义为条件删除
用于移动构造函数,非静态数据成员或直接或虚拟基类,其类型不具有移动构造函数,并且不易于复制。
在下文中,移动构造函数将被定义为已删除,因为CopyOnly
不可轻易复制。
struct Question
{
std::vector<int> data_;
CopyOnly copyOnly_;
Question(Question&&) = default;
};