2016-12-02 3 views
0

Ces constructeurs sont-ils corrects? Sont-ils bien formés et correctement surchargés à la fois pour les valeurs et les valeurs?Ces constructeurs sont-ils corrects?

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

Répondre

1

Cela me semble bon.

Dans le constructeur de mouvement, std::move(p_data) est nécessaire car p_data est une lvalue.

+2

Êtes-vous sûr de 'noexcept'? 'make_shared' doit généralement allouer de la mémoire, et c'est une opération qui n'est pas 'noexcept'. – j6t

+0

@ j6t: totalement oublié le 'std :: shared_ptr' et concentré sur' std :: string', whoops :) –

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

Etes-vous sûr que vous voulez implicites conversions de std::string-Obj? Si pas, pensez à faire le constructeur 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

C'est juste un exemple, l'objet réel a plus d'un paramètre;) –