将Type&&(右值引用)绑定到可修改的左值和

Binding of Type&& (rvalue reference) to modifiable lvalues and

本文关键字:修改 Type 引用 绑定      更新时间:2023-10-16

深化我的C++知识,发现了一篇解释Rvalue引用的优秀文章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:"initializing":无法从"std::string"转换为'std::string&'

根据文章

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

这完全应该发生在26号线上。那我为什么会出错呢
谢谢

编辑:发现与此主题相关的非常有趣的文章:http://web.archive.org/web/20120529225102/http://cpp-next.com/archive/2009/09/用右值引用移动它/#fn:insertionsort。未来的读者可能会发现它很有帮助。

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

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

参数x既可以绑定到左值,也可以绑定到右值,但当它绑定到一个左值时,它不是右值引用,相反,推导出的类型TU&,并且U& &&中的两个引用仅塌陷为左值引用,因此该参数的类型为U&(去掉左值引用)。这通常被称为通用引用

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

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

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

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

这段代码告诉编译器(和读者!)您承诺使用modifiable_lvalue