【发布时间】:2019-10-08 01:35:47
【问题描述】:
我试图理解“有效的现代 C++”中关于特殊成员函数生成的第 17 项,所以我尝试了一些示例并试图推理某些行为。书中说:
..当我提到移动构造或移动分配数据成员或基类的移动操作时,不能保证移动会实际发生。实际上,“按成员移动”更像是按成员移动请求,因为不支持移动的类型(即,不提供对移动操作的特殊支持,例如,大多数 C++98 遗留类)将被“移动” ” 通过他们的复制操作。 ... 此外,不会为任何明确声明复制操作的类生成移动操作。
如果我显式删除移动构造函数,则下面的代码会出错,但如果我不这样做,则对象“s1”会在没有任何错误的情况下构造副本。这是指向相同代码的魔杖盒链接:wandbox link。我想我不明白删除移动构造函数和不定义移动构造函数之间的区别。
#include <iostream>
struct S
{
S() = default;
S(const S&) {
std::cout << "Copying" << std::endl;
}
// S(S&&) = delete;
};
S return_lvalue() {
S ret{};
return ret;
}
int main() {
std::cout << "Hello world" << std::endl;
// Error here if I delete move constructor
S s1 = return_lvalue();
}
【问题讨论】:
标签: c++ c++11 move move-semantics