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 提出的问题。
我在阅读有关封装多态性的文章时遇到了一段这样的代码:
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 提出的问题。