Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现每次移动构造函数以避免深度复制?_C++_C++14_Move_Deep Copy - Fatal编程技术网

C++ 如何实现每次移动构造函数以避免深度复制?

C++ 如何实现每次移动构造函数以避免深度复制?,c++,c++14,move,deep-copy,C++,C++14,Move,Deep Copy,我正在练习每次通过传递R值来执行move构造函数。但有时会调用深度复制构造函数,但不支持它 我在向量中插入一个R值对象。此代码中的逻辑缺陷是什么 我已经试过调试,我不明白为什么在移动对象后调用深度复制构造函数 #include <iostream> #include <string> #include <vector> using namespace std; class example{ private: int *pointer; pub

我正在练习每次通过传递R值来执行move构造函数。但有时会调用深度复制构造函数,但不支持它

我在向量中插入一个R值对象。此代码中的逻辑缺陷是什么

我已经试过调试,我不明白为什么在移动对象后调用深度复制构造函数

#include <iostream>
#include <string>
#include <vector>
using namespace std;
class example{
    private:
     int *pointer;
public:
    //constructor
    example(int d){
        pointer = new int;
        *pointer = d;
        cout<<"Constructor Called"<<endl;
    }


// deep copy
    example(const example &source){
        pointer = new int;
        *pointer= *source.pointer;
        cout<<"deep copy made"<<endl;
    }
// Move Constructor
    example(example &&source):pointer{source.pointer}{
    source.pointer = nullptr;
    cout << "object moved"<<endl;
    }
    ~example() {
        delete pointer;
        cout << "Destroyed"<<endl;
    }

};

int main()
{

    vector <example> vec;
    vec.push_back(example{300});
    vec.push_back(example{300});
    vec.push_back(example{300});
    vec.push_back(example{300});
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
课例{
私人:
int*指针;
公众:
//建造师
示例(int d){
指针=新整数;
*指针=d;

可以解决它吗?添加NOEXCEPT解决了这个问题

 example(example &&source) noexcept :pointer{source.pointer}  {
        source.pointer = nullptr;
        cout << "object moved"<<endl;
        }
example(example&&source)noexcept:pointer{source.pointer}{
source.pointer=nullptr;

可以解决它吗?添加NOEXCEPT解决了这个问题

 example(example &&source) noexcept :pointer{source.pointer}  {
        source.pointer = nullptr;
        cout << "object moved"<<endl;
        }
example(example&&source)noexcept:pointer{source.pointer}{
source.pointer=nullptr;

无法尝试将move构造函数更改为
示例(示例和源代码)noexcept:
(其余都相同)但是noexcept做什么呢?我在我的课程教程中找到了它,但原因不是given@ZahidulAmin:noexcept允许库使用move。因为如果可能发生异常,它必须是可撤消的,才能使vector元素处于安全状态。请尝试将move构造函数更改为
example(example&&source)noexcept:
(其余的都一样)但是noexcept做什么呢?我在我的课程教程中找到了它,但原因不是given@ZahidulAmin:noexcept允许库使用move。因为如果可能发生异常,它必须是可撤消的,才能使vector元素处于安全状态。