自动生成带有声明析构函数的默认移动构造函数
Autogenerated default move constructor with declared destructor
c++ 11标准指定不应该为声明析构函数的类生成自动生成的move构造函数,而是为以下类生成代码片段构建并正确运行:
#include <iostream>
class C
{
public:
~C() { std::cout << "Called C:~C" << std::endl; }
private:
std::string v;
};
int main()
{
C c1;
C c2 = std::move(c1);
return 0;
}
我可以构建clang
4.2.1和gcc
4.4.3。我错过什么了吗?
初始化使用隐式定义的copy构造函数。一般来说,当move构造函数或move赋值操作符由于某种原因不能使用时,move操作总是会返回到复制操作,因为复制构造函数和复制赋值操作符总是被声明的(尽管在某些情况下它们可以被删除)。
Brian的回答已经解释了为什么你的代码可以编译。要正确检查移动因子是否被抑制,只需将不可复制的对象放入类中,例如std::unique_ptr
:
class C
{
public:
~C() { std::cout << "Called C:~C" << std::endl; }
private:
std::string v;
std::unique_ptr<char> p;
};
现在gcc 5.1.0产生这个错误:
错误:使用已删除函数' C::C(const C&) '
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 这将执行默认移动操作吗?
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 默认移动成员定义为已删除,而未定义特殊成员?
- 显式默认析构函数禁用类中的默认移动构造函数
- 编译器是否优化了默认移动构造函数?
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 具有互斥锁成员的默认移动构造函数
- 默认移动分配调用析构函数,复制分配不
- 默认移动构造函数采用 const 参数
- 如何使用默认移动构造函数将数据移出范围
- 默认移动构造函数
- 默认移动构造函数 Visual Studio 2015
- 默认移动构造
- 警告:X的默认移动分配运算符将多次移动分配虚拟基类Y
- 了解默认移动构造函数定义
- 子类中的默认移动构造函数
- 被认为是用户声明的默认移动构造函数
- 默认移动构造函数、默认复制构造函数和默认赋值操作符
- 自动生成带有声明析构函数的默认移动构造函数