C++ C++;唯一的ptr初始化

C++ C++;唯一的ptr初始化,c++,initialization,C++,Initialization,我有个问题。让我们看看下面的代码: #include <iostream> #include <string> #include <memory> class Writable { public: virtual ~Writable() = default; virtual void write(std::ostream& out) const = 0; }; class String : public Writable { pub

我有个问题。让我们看看下面的代码:

#include <iostream>
#include <string>
#include <memory>

class Writable {
public:
    virtual ~Writable() = default;
    virtual void write(std::ostream& out) const = 0;
};

class String : public Writable {
public:
    String(const std::string& str) : m_str(str) {}
    virtual ~String() override = default;
    virtual void write(std::ostream& out) const override { out << m_str << '\n'; }
private:
    std::string m_str;
};

class Number : public Writable {
public:
    Number(double num) : m_num(num) {}
    virtual ~Number() override = default;
    virtual void write(std::ostream& out) const override { out << m_num << '\n'; }
private:
    double m_num;
};

int main() {
    std::unique_ptr<Writable> str1(new String("abc"));
    std::unique_ptr<Writable> num1(new Number(456));

    str1->write(std::cout);
    num1->write(std::cout);
}
#包括
#包括
#包括
类可写{
公众:
virtual~Writable()=默认值;
虚空写入(std::ostream&out)常量=0;
};
类字符串:公共可写{
公众:
字符串(const std::String&str):m_str(str){}
virtual~String()override=默认值;

虚空写入(std::ostream&out)常量重写{out

std::unique_ptr<Writable> str1(new String("abc"));
std::unique_ptr str1(新字符串(“abc”);
如果构造函数被标记(如在构造函数中),则需要这种形式的初始化


explicit
构造函数以
std::unique\u ptr str1=new String(“abc”);的形式禁用

std::unique_ptr<Writable> str1(new String("abc"));
std::unique_ptr str1(新字符串(“abc”);
如果构造函数被标记(如在构造函数中),则需要这种形式的初始化


显式
构造函数以
std::unique_ptr str1=new String(“abc”);
的形式禁用

这里您正在创建一个新的
unique_ptr
并使用
new
操作符返回的原始指针初始化

std::unique_ptr<Writable> str1(new String("abc"));
然而,编译器可以(最有可能)执行move-elison并使上述两个操作等效

下面是从c++14及更高版本初始化的正确方法

std::unique_ptr<Writable> v1 = std::make_unique<String>();
std::unique_ptr v1=std::make_unique();

在这里,您正在创建一个新的
唯一\u ptr
并使用
new
运算符返回的原始指针进行初始化

std::unique_ptr<Writable> str1(new String("abc"));
然而,编译器可以(最有可能)执行move-elison并使上述两个操作等效

下面是从c++14及更高版本初始化的正确方法

std::unique_ptr<Writable> v1 = std::make_unique<String>();
std::unique_ptr v1=std::make_unique();

就像你能写的一样

std::vector<int> foo(10);
创建一个指向新字符串(“abc”)
std::unique_ptr
。这与执行相同

std::vector<int> foo = std::vector(10);
std::vector foo=std::vector(10);

std::unique_ptr str1=std::unique_ptr(新字符串(“abc”);
但后面的情况使用复制初始化


为了节省打字时间,您可以使用

auto str1 = std::make_unique<String>("abc");
auto str1=std::使_唯一(“abc”);

相反,当你声明你的
唯一的\u ptr
时,就像你可以写的那样

std::vector<int> foo(10);
创建一个指向新字符串(“abc”)
std::unique_ptr
。这与执行相同

std::vector<int> foo = std::vector(10);
std::vector foo=std::vector(10);

std::unique_ptr str1=std::unique_ptr(新字符串(“abc”);
但后面的情况使用复制初始化


为了节省打字时间,您可以使用

auto str1 = std::make_unique<String>("abc");
auto str1=std::使_唯一(“abc”);
相反,当您声明您的
唯一\u ptr