3

加深我的 C++ 知识,并找到解释右值参考的优秀文章http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part -2.aspx(文章有些过时,发表于 2009 年)。

在文章中有几行应该出错

// original
   string&& i = modifiable_lvalue;         // Line 26

    string&& j = const_lvalue;              // Line 27 - ERROR

    string&& k = modifiable_rvalue();       // Line 28

    string&& l = const_rvalue();            // Line 29 - ERROR

但是,在 Visual Studio 2012 中string&& i = modifiable_lvalue; // Line 26 - ERROR也会出错!!!

错误 C2440:“正在初始化”:无法从“std::string”转换为“std::string &&”

根据这篇文章

可修改的右值引用 Type&& 愿意绑定到可修改的左值和可修改的右值

这正是应该在第 26 行发生的。那么为什么我会收到错误消息?
谢谢 !

编辑:发现与此主题相关的非常有趣的文章:http://web.archive.org/web/20120529225102/http: //cpp-next.com/archive/2009/09/move-it-with-rvalue-references /#fn:插入排序。未来的读者可能会发现它很有帮助。

4

2 回答 2

8

这篇文章是错误的,右值引用不能绑定到左值。现在有引用折叠的概念(此处不适用),它允许在模板参数中进行类似的操作:

template <typename T>
void f(T&& x);

参数x可以绑定到左值或右值,但是当它绑定到左值时,它不是右值引用,而是推导的类型TU&,并且两个引用U& &&折叠成左值引用,所以参数是类型U&右值引用被删除)。这通常称为通用参考

同样,这不适用于您从文章中引用的代码,这是不正确的。

请注意,文章写于 2009 年,当时的标准草案可能有文章中描述的行为。从 2009 年到 2011 年,当现行标准最终被接受时,发生了一些变化。

于 2013-08-28T19:36:13.970 回答
2

文章不正确。您需要static_cast<std::string&&>使用 std::move() 将其显式转换为右值引用,或者使用 a 或更习惯用法:

std::string&& i = std::move( modifiable_lvalue );

这段代码告诉编译器(和读者!)你承诺完成modifiable_lvalue.

于 2013-08-28T19:36:03.747 回答