将Type&&(右值引用)绑定到可修改的左值和
Binding of Type&& (rvalue reference) to modifiable lvalues and
深化我的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&,愿意绑定到可修改的左值和可修改右值
这完全应该发生在26号线上。那我为什么会出错呢
谢谢
编辑:发现与此主题相关的非常有趣的文章:http://web.archive.org/web/20120529225102/http://cpp-next.com/archive/2009/09/用右值引用移动它/#fn:insertionsort。未来的读者可能会发现它很有帮助。
文章错误,右值引用无法绑定到左值。现在有了引用折叠的概念(这里不适用),它允许在模板参数中进行类似的操作:
template <typename T>
void f(T&& x);
参数x
既可以绑定到左值,也可以绑定到右值,但当它绑定到一个左值时,它不是右值引用,相反,推导出的类型T
是U&
,并且U& &&
中的两个引用仅塌陷为左值引用,因此该参数的类型为U&
(去掉左值引用)。这通常被称为通用引用。
同样,这不适用于您从文章中引用的代码,这是不正确的。
请注意,该条款写于2009年,当时的标准草案可能具有该条款中描述的行为。从2009年到2011年,当现行标准最终被接受时,发生了一些变化。
文章不正确。您需要使用static_cast<std::string&&>
或更惯用的std::move():将其显式转换为右值ref
std::string&& i = std::move( modifiable_lvalue );
这段代码告诉编译器(和读者!)您承诺使用modifiable_lvalue
。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 将Type&&(右值引用)绑定到可修改的左值和
- 对于类型修改特征,我是否应该为 typename::transform<...>::type 提供一个模板 typedef(又名使用)方便包装器?