11

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&&);
};

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

4

1 回答 1

15

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

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

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

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

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

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

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

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

于 2013-07-05T16:14:51.047 回答