// . struct person { person(std::string first_name, std::string last_name) : first_name{std::move(first_name)} // , last_name{std::move(last_name)} // std::move ! {} private: std::string first_name; std::string last_name; };
std::string first{"abc"}, last{"def"}; person p1{first, last}; // (1) person p2{std::move(first), last}; // !!! person p2{std::move(first), std::move(last)}; // (3) person p3{"x", "y"}; //
// . struct person { person(const std::string& first_name, const std::string& last_name) : first_name{first_name} , last_name{last_name} {} private: std::string first_name; std::string last_name; }; std::string first{"abc"}, last{"def"}; person p1{first, last}; // , // , first last // ? // 0 ! const& .
// . struct person { person(std::string&& first_name, std::string&& last_name) : first_name{std::move(first_name)} , last_name{std::move(last_name)} {} private: std::string first_name; std::string last_name; }; std::string first{"abc"}, last{"def"}; person p1{std::move(first), std::move(last)}; // // , && : person p2{std::string{first}, std::string{last}}; // FOOOO
// . struct person { person(std::string&& first_name, std::string&& last_name) : first_name{std::move(first_name)} , last_name{std::move(last_name)} {} person(const std::string& first_name, std::string&& last_name) : first_name{first_name} , last_name{std::move(last_name)} {} person(std::string&& first_name, const std::string& last_name) : first_name{std::move(first_name)} , last_name{last_name} {} person(const std::string& first_name, const std::string& last_name) : first_name{first_name} , last_name{last_name} {} private: std::string first_name; std::string last_name; };
// ( ), . struct person { template <typename T1, typename T2> person(T1&& first_name, T2&& last_name) : first_name{std::forward<T1>(first_name)} , last_name{std::forward<T2>(last_name)} {} private: std::string first_name; std::string last_name; };
// . struct person { person(const std::string& first_name, const std::string& last_name) : first_name{first_name} , last_name{last_name} {} private: // : , // const std::string& first_name; const std::string& last_name; }; person p{"x", "y"}; // --,
// . struct person { person(std::string& first_name, std::string& last_name) : first_name{first_name} , last_name{last_name} {} private: // , shared_ptr: // , std::string& first_name; std::string& last_name; };
// ( ). struct person { person(std::shared_ptr<portfolio> pf) : pf{std::move(pf)} // std::move {} private: std::shared_ptr<portfolio> pf; }; auto psh = std::make_shared<portfolio>("xxx", "yyy", "zzz"); ... person p1{psh}; person p2{std::move(psh)}; // (X) , psh
Source: https://habr.com/ru/post/460955/
All Articles