2016-12-02 189 views
0

这些构造函数是否正确?这些构造函数是否正确?

它们是否形成良好并正确地重载了​​左值和右值?

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))} 
{} 

回答

1

看起来不错。

在移动构造函数中,std::move(p_data)是必需的,因为p_data是一个左值。

+2

你肯定'noexcept'? 'make_shared'通常需要分配内存,这是一个不是'noexcept'的操作。 – j6t

+0

@ j6t:完全忘记了'std :: shared_ptr',并专注于'std :: string',哎呀:) –

0
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)} 
{} 
+0

这只是一个例子,真实的对象有多个参数;) –