2016-12-02 140 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

這只是一個例子,真實的對象有多個參數;) –