【问题标题】:What's difference between forward and move in the constructor of class? [duplicate]类的构造函数中的 forward 和 move 有什么区别? [复制]
【发布时间】:2018-12-13 01:31:12
【问题描述】:

我读了很多关于它的内容,但仍然无法理解。这两种变体有什么区别:

template <typename val_t>
class fact_t: public exp_t<val_t> {
    val_t m_value;
public:
    fact_t(val_t &&value) : m_value{std::forward<val_t>(value)} {}
};

template <typename val_t>
class fact_t: public exp_t<val_t> {
    val_t m_value;
public:
    fact_t(val_t &&value) : m_value{std::move(value)} {}
};

当一个变体失败但另一个变体仍然可以工作时,有人可以举一个例子吗?

我尝试使用第一种变体:

std::string str = "str";
fact_t<std::string> f(str);

但是会导致编译时出错。虽然我从其他主题和 cppreference 了解到 strlvalue 并且 std::forward 允许使用它。我错过了哪里?

P.S.很抱歉,如果这是一个愚蠢的问题,但我真的无法理解。

【问题讨论】:

  • @KerrekSB 我也读过这个话题
  • @KerrekSB,但是当我尝试编写类似std::string x = "str"; fact_t&lt;std::string&gt; f(x); 的内容时,两种变体都失败了。虽然据我了解它是 lvalue 并且必须与 forward 一起使用。怎么了?
  • @Jans 我已经读过这个话题了。我已经用更多细节更新了我的问题。

标签: c++ c++11


【解决方案1】:

如果val_t不是左值引用类型,那么构造函数中的value是右值引用,std::forward等价于std::move

如果val_t 是左值引用,那么value 也是。 std::forward 然后返回一个左值引用并且代码编译。 std::move返回一个右值引用,不能绑定到m_value(这是一个左值引用),编译器报错。

Demo

fact_t&lt;std::string&gt; f(str); 无法编译的原因是它试图将左值传递给需要右值的参数。

【讨论】:

  • 哦,非常感谢!我知道我声明了一个参数错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2019-02-03
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
相关资源
最近更新 更多