std::forward 具有按值传递参数

std::forward with pass-by-value argument

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

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

模型构造函数中转发impl有什么意义?

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

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

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