这些构造函数正确

Are these constructors correct?

本文关键字:构造函数      更新时间:2023-10-16

这些构造函数是否正确?

它们是否形成良好,正确地超载了lvalues和rvalues?

std::shared_ptr<std::string> data;
// lvalue constructor
Obj(std::string const & p_data)
    : data {std::make_shared<std::string>(p_data)}
{}
// rvalue constructor
Obj(std::string && p_data)
    : data {std::make_shared<std::string>(std::move(p_data))}
{}

对我来说很好。

在移动构造函数中,std::move(p_data)是必要的,因为p_data是lvalue。

Obj(std::string const & p_data)
    : data {std::make_shared<std::string>(p_data)}
{}

您确定要隐式std::string转换为Obj吗?如果不是,请考虑制作构造函数explicit

// Prevent *implicit* conversions from std::string to Obj
explicit Obj(std::string const& p_data)
    : data{std::make_shared<std::string>(p_data)}
{}