std::forward with pass-by-value 参数

std::forward with pass-by-value argument

提问人:kiokko89 提问时间:5/9/2015 最后编辑:Jonny Ckiokko89 更新时间:5/10/2015 访问量:574

问:

我正在阅读有关封装多态性的文章,我遇到了一段这样的代码:

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;
};

在 Model 构造函数中转发 impl 有什么意义?

如果参数是按值传递的,那么转发参数是否有意义?

C++ C++11 按值传递完美 转发

评论

0赞 cpplearner 5/9/2015
template 参数可以是引用类型。考虑到这一点,这对我来说是有道理的。std::forward

答:

5赞 Howard Hinnant 5/9/2015 #1

如果 where 是左值引用类型(例如)是合法的(根据 Model 的文档),那么这里使用的是正确的工具。否则(如果应始终是对象类型),则是正确的工具。Model<T>TX&forwardTmove

话虽如此,成员函数使它看起来应该只是一个对象类型。因此,在这里使用将是一个更好的工具。在这种情况下,在技术上并没有错,只是令人困惑,因为它提出了 OP 提出的问题。cloneTmoveforward

评论

1赞 kiokko89 5/9/2015
感谢您的回复,也许为了清楚起见,我应该发布我正在阅读的所有文章:链接。这对我来说可能有点太高级了,但你的回答对我帮助很大。谢谢