2015-05-09 3 views
4

Я читал о инкапсулированном полиморфизме, и я наткнулся на кусок кода, как этот:станда :: вперед с передачей по значению аргумента

template <typename T> 
struct Model<T> : Concept 
{ 
    Model<T>(T impl) : 
     mImpl(std::forward<T>(impl)) 
    { 

    } 
    virtual Concept* clone() const override 
    { 
     return new Model<T>(mImpl) 
    } 

    virtual void operator (const LogMessage::Meta& meta, const std::string& message) override 
    { 
     mImpl(meta, message); 
    } 

    T mImpl; 
}; 

Какой смысл экспедиторских осущий в модели конструктора?

Имеет ли смысл направить аргумент, если он передан по значению?

+0

Аргумент шаблона может быть ссылочным типом. Имея это в виду, это 'std :: forward' имеет для меня некоторый смысл. – cpplearner

ответ

5

Model<T> Если где T является Lvalue ссылочного типа (например, X&) является законным (согласно документации модели), то forward является правильным инструментом для использования здесь. В противном случае (если T всегда должен быть типом объекта), move - правильный инструмент.

Это, как говорится, функция-член clone делает его похожим на T должен быть только тип объекта. И поэтому move будет лучшим инструментом для использования здесь. И в этом случае forward не является технически неправильным, а просто запутанным, поскольку он поднимает именно тот вопрос, который задает ОП.

+1

благодарю вас за ответ, возможно, для ясности я должен был опубликовать всю статью, которую я читал: [link] (http://www.grandmaster.nu/blog/?page_id=158). Вероятно, это было слишком сложно для меня, но ваш ответ мне очень помог. благодаря – kiokko89

Смежные вопросы