是用于阻止移动的私有移动构造函数

Is a private move constructor to prevent move?

本文关键字:移动 构造函数 用于      更新时间:2023-10-16

C++中的一个常见模式是使复制构造函数私有化:

class A
{
    public:
        // ...
    private:
        A(const A&);
};

但是下面的代码会编译吗(在C++11/14中):

A f();
auto a = f();

该标准包含有关自动生成移动构造函数的信息。我既没有访问标准,也没有实际生成移动构造函数的编译器。我的问题是:我必须写吗

class A
{
    public:
        // ...
    private:
        A(const A&);
        A(const A&&);
};

以防止移动(和操作员=类似)?

但是下面的代码会编译吗(在C++11/14中):

不,不会。用户声明的复制构造函数的存在应禁止隐式生成移动构造函数。根据C++11标准第12.8/9段:

如果类X的定义没有显式声明移动构造函数,则会隐式声明一个当且仅当

--X没有用户声明的复制构造函数

--X没有用户声明的副本分配运算符

--X没有用户声明的移动分配运算符

--X没有用户声明的析构函数,并且

--move构造函数不会被隐式定义为已删除。