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我已经读过这个话题了。我更新了我的问题的更多细节。哦,非常感谢!我发现我声明了一个错误的参数