小编mor*_*rte的帖子

如果不应该,编译器会生成默认的移动构造函数

来自N3337:

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

X没有用户声明的复制构造函数,X没有用户声明的复制赋值运算符,X没有用户声明的移动赋值运算符,X没有用户声明的析构函数,并且移动构造函数将不要隐式定义为已删除.

第一个问题是:为什么编译器在不应该生成移动构造函数时(存在用户声明的析构函数和其他阻止生成移动构造函数的函数).下面的示例程序打印constructorCounter=5表示使用了移动构造函数(没有移动操作值:: constructorCounter应该是10)

#include <iostream>

class value {
    public:
        value() {
            ++constructorCounter;
        }
        value(const int value)
            : _value(value)
        {
            ++constructorCounter;
        }
        value(const value& other)
            : _value(other._value)
        {
            ++constructorCounter;
        }
        const value& operator=(const value& rhs) {
            _value = rhs._value;
            return _value;
        }
        ~value() { }
        static int constructorCounter;
    private:
        int _value;
};

int value::constructorCounter = 0;

class array {
    public:
        //  array() = delete;
        //  array(array&&) = delete;
        array(const int size)
            : _size(size), _values(new value[size])
        {
            std::clog …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics c++11 c++14

1
推荐指数
1
解决办法
136
查看次数

标签 统计

c++ ×1

c++11 ×1

c++14 ×1

move-semantics ×1