Mel lain new topic ids

In this case you should not require target_model_config to be a std::shared_ptr. Imagine that on caller site you don't have std::shared_ptr<ModelConfig>, but you have a native pointer (ModelConfig*) , or a reference (ModelConfig&). How would you invoke copy constructor? There are no good alternatives! 

You, please change "std::shared_ptr<artm::ModelConfig>" to "const artm::ModelConfig&". If you really want the argument to be optional, then create a second copy constructor without this parameter. Technically you may combine both copy constructors (with/without ModelConfig*) into a single one that accepts a pointer ("const artm::ModelConfig*"), but this is against Google Code Style -- they ask to pass all const objects by reference.