是一个私人移动构造函数,以防止移动?

Pet*_*ter 10 c++ c++11

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

class A
{
    public:
        // ...
    private:
        A(const A&);
};
Run Code Online (Sandbox Code Playgroud)

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

A f();

auto a = f();
Run Code Online (Sandbox Code Playgroud)

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

class A
{
    public:
        // ...
    private:
        A(const A&);
        A(const A&&);
};
Run Code Online (Sandbox Code Playgroud)

防止移动(和运营商=类似)?

And*_*owl 14

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

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

如果类X的定义没有显式地声明一个移动构造函数,那么当且仅当一个移动构造函数被隐式声明为默认值时

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

- X没有用户声明的复制赋值运算符,

- X没有用户声明的移动赋值运算符,

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

- 移动构造函数不会被隐式定义为已删除.