已显式删除移动构造函数
Explicitly deleted move constructor
为什么:
struct A
{
A(int) {
cout << "construct from int" << endl;
}
A(A&&) = delete;
A(const A &) {
cout << "copy constructor" << endl;
}
};
int main(){
A a = 0;
}
给我一个错误:
error: use of deleted function ‘A::A(A&&)’
为什么当我添加这样的移动构造函数
A(A&&) {
cout << "move constructor" << endl;
}
它编译得很好,但程序的输出只是
construct from int
据我所知,编译器要求构造函数,但并没有使用它。为什么?这对我来说毫无意义。
附言:我认为
A a = 0;
相当于
A a = A(0);
但是为什么既不调用move构造函数也不调用move-assignment运算符呢?
根据C++标准(12.8复制和移动类对象)
31当满足某些标准时,允许省略实现类对象的复制/移动构造,即使构造函数为复制/移动操作选择和/或为物体有副作用。在这种情况下,实现会处理省略的复制/移动操作的源和目标仅为两个指代同一物体的不同方式,以及当两个对象如果没有优化,就会被破坏。122允许在以下情况(可以组合以消除多个副本):。。。。--当尚未绑定到引用的临时类对象(12.2)将被复制/移动到具有相同cv不合格类型,复制/移动操作可以通过将临时对象直接构建到省略复制/移动
和
30如果复制/移动构造函数或对象的复制/移动赋值运算符是隐式odr使用的,并且特殊成员功能不可访问(第11条)。[注:使用复制/移动构造函数将一个对象复制/移动到另一个对象或者复制/移动分配运算符没有更改布局,或者任一对象的大小--尾注]
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 移动构造函数和右值引用
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- C++:为什么不调用移动构造函数?
- 移动构造函数永远不会被调用
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 运算符+ 的规范实现涉及额外的移动构造函数
- C ++为什么在移动构造函数中需要移动/前进
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 为什么这里不调用移动构造函数?
- 隐式移动构造函数
- 如何为具有私有成员的派生类实现移动构造函数
- 为什么不调用移动构造函数
- 是否可以避免在以下代码中复制/移动构造函数的需要?