将复制构造函数与std :: make_shared

时间:2019-07-18 18:10:26

标签: c++ pass-by-reference shared-ptr copy-constructor make-shared

我已经定义了一个简单类Integer,其中包含一个int值,调用std::make_shared<Integer>(&ref)将迫使程序使用接受int的构造函数。我实施了错误的复制构造函数,还是我使用std::make_shared时出了点问题? 呼叫std::make_shared<Integer>(ref)有什么区别? 而且,Integer copied_integer(integer);为什么不使用复制构造函数?也不允许使用Integer copied_integer(&integer);

这是代码

#include <memory>
#include <iostream>
#include "DoubleLinkedList.h"

class Integer {
private:
    int number;
public:
    Integer(int number) : number(number) {}

    Integer(const Integer &integer) : number(integer.number) {}

    Integer& operator=(const Integer& other) {
        if (this != &other) {
            number = other.number;
        }

        return *this;
    }

    int get() { return number; }

};

int main() {


    Integer integer(30);
    const Integer &ref = integer;
    Integer copied_integer(integer);
    auto pointer = std::make_shared<Integer>(&ref);
    auto sp = std::make_shared<Integer>(10);
    std::cout << "sp -> " << sp->get() << std::endl;
    std::cout << "pointer -> " << pointer->get() << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

更改此:

auto pointer = std::make_shared<Integer>(&ref);

对此:

auto pointer = std::make_shared<Integer>(ref);

因为您应该收到类似以下的错误:

gcc-head/include/c++/10.0.0/ext/new_allocator.h:150:20: error: invalid conversion from 'const Integer*' to 'int' [-fpermissive]
  150 |  noexcept(noexcept(::new((void *)__p)
      |                    ^~~~~~~~~~~~~~~~~~
      |                    |
      |                    const Integer*
  151 |        _Up(std::forward<_Args>(__args)...)))
      |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:8:17: note:   initializing argument 1 of 'Integer::Integer(int)'
    8 |     Integer(int number) : number(number) {}
      |             ~~~~^~~~~~

它会通知/提醒您ref的类型为const Integer*,而您只需要const Integer&,即该副本构造函数中参数的类型。