C++ 什么';类的构造函数中前进和移动的区别是什么?

C++ 什么';类的构造函数中前进和移动的区别是什么?,c++,c++11,C++,C++11,我读了很多关于它的书,但还是没能读到。这两种变体之间有什么区别: 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>

我读了很多关于它的书,但还是没能读到。这两种变体之间有什么区别:

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)} {}
};
模板
类事实:公共经验{
val_t m_值;
公众:
事实(值)&&value:m值{std::forward(值)}{
};
模板
类事实:公共经验{
val_t m_值;
公众:
事实(val)&&value):m_值{std::move(value)}{
};
有人能举一个例子,说明一种变体失败,而另一种变体仍然有效吗

我尝试以下一种方式使用第一种变体:

std::string str = "str";
fact_t<std::string> f(str);
std::string str=“str”;
事实(str);
但它会导致编译时错误。尽管我从其他主题和参考文献中了解到,
str
左值,并且
std::forward
允许使用它。我在哪里失踪


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

如果
val\u t
不是左值引用类型,那么构造函数中的
value
是右值引用,
std::forward
相当于
std::move

如果
val\u t
是左值引用,那么
value
也是左值引用<然后返回一个左值引用,代码编译
std::move
返回一个右值引用,它不能绑定到
m_值
(这是一个左值引用),编译器报告一个错误


原因
fact\u t f(str)编译失败是因为它试图将左值传递给需要右值的参数。

相关:。还有@KerrekSB我读过这个话题too@KerrekSB,但当我试图写一个类似这样的东西时,
std::string x=“str”;事实f(x),它在两种变体中都失败。虽然据我所知,它是左值的,并且必须与
向前
一起工作。怎么了?@Jans我已经读过这个话题了。我更新了我的问题的更多细节。哦,非常感谢!我发现我声明了一个错误的参数