c++ - 为什么在移除“移动构造函数”时使用“复制构造函数”?
问题描述
作为主题,相关代码为:
#include <iostream>
class ABC
{ public:
ABC()
{
std::cout<< "default construction" << std::endl;
}
ABC(const ABC& a)
{
std::cout << "copy construction" << std::endl;
}
ABC(const ABC&& a)
{
std::cout << "move construction" << std::endl;
}
};
int main()
{
ABC c1 = ABC();
return 0;
}
使用 -fno-elide-constructors -std=c++11 输出
default construction
move construction
如果我删除上面的移动构造函数,那么输出是:
default construction
copy construction
为什么copy construction
可以使用 whilemove constructor
已被删除?你看,如果有用户定义move constructor
的,编译器更喜欢使用move constructor
.
根据一些文档,编译器提供了默认值move constructor
。**那么为什么编译器不使用默认值move constructor
呢?我是 C++ 的新手。如果能在这个问题上得到一些帮助,我将不胜感激。
解决方案
根据一些文档,编译器提供了一个默认的
move constructor
.
让我们看一些文档。以下来自cppreference.com。
如果[conditions]则编译器将声明一个移动构造函数作为其类的非显式内联公共成员,并带有签名
T::T(T&&)
。
你是对的。编译器确实在正确的条件下提供了一个默认的移动构造函数。但是,这些条件很重要。您似乎知道的第一个条件:不能有用户定义的移动构造函数。所以只剩下这个条件列表:
- 没有用户声明的复制构造函数;
- 没有用户声明的复制赋值运算符;
- 没有用户声明的移动赋值运算符;
- 没有用户声明的析构函数;
你去吧。您的用户定义的复制构造函数阻止编译器提供默认的移动构造函数。因此没有可使用的移动构造函数。
推荐阅读
- vue.js - Electron-vue 创建新窗口
- python-3.x - 在 Windows 10 上带有上下文管理器的 Python 临时文件导致 PermissionError:[Errno 13]
- angular - 如何构建结合了 Angular 和 Spring Boot 应用程序的 Docker 映像?
- php - 使用 PHP 更新 sql 表中的字段
- javascript - JS:实例化变量无法识别输入值
- xaml - 非根对象中的 XAML 事件处理程序
- java - Axon - MySql 的 JPA 事件存储
- javascript - 具有多个变量的三元运算符
- javascript - 显示一个由于数据库请求(门户字段)
- html - 我的问题是将字体上传到网站