【问题标题】:std::forward with pass-by-value argument带有按值传递参数的 std::forward
【发布时间】:2015-07-20 10:11:54
【问题描述】:

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

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有什么意义?

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

【问题讨论】:

  • 模板参数可以是引用类型。考虑到这一点,std::forward 对我来说是有意义的。

标签: c++ c++11 pass-by-value perfect-forwarding


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,也许为了清楚起见,我应该发布我正在阅读的所有文章:link。这对我来说可能有点太高级了,但是您的回答对我帮助很大。谢谢
猜你喜欢
  • 2016-03-21
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多