2016-06-19 155 views
1

我已阅读thisthis,但我还是不明白,为什么下面的代码XCode中编译:C++:右值引用转换成非const左值参考

void func2(string &s) { 
    s = "yyyyy"; 
} 

void func(string &&s) { 
    func2(s); 
} 

int main() { 
    func("xxxxx"); 
    return 0; 
} 

我认为一个右值引用不应该” t转换为非常量左值引用,对吗?一般来说,左值引用和右值引用之间的转换规则是什么?我已经知道,常量左值引用可以绑定到右值,但右值引用(而不是右值)呢?非常感谢!

+1

在'串&& s''s'是可结合到一个左值参考左值。 – nwp

+0

我以为''s'''是一个右值引用。为什么是左值?这是因为它有身份而且是可移动的?如果是这样,他们之间有什么区别?谢谢! –

+0

请记住,如果一个对象有一个名称,它是一个左值 – NathanOliver

回答

1

r值引用是对原始对象的引用,因此将其转换为l值引用将仅引用原始对象。
一旦移动构造函数在引用上被调用,原始对象应该被重置为原始状态,对其的引用也是如此。

此示例可能澄清:

#include <iostream> 
using namespace std; 

int main() 
{ 
    string s = "my string"; 
    string &&rval = move(s); 
    cout << '"' << rval << '"' << endl; // "my string" 
    cout << '"' << rval << '"' << endl; // "my string" 
    cout << '"' << s << '"' << endl; // "my string" 
    string &lval = rval; 
    cout << '"' << lval << '"' << endl; // "my string" 
    string s2(move(rval)); 
    cout << '"' << rval << '"' << endl; // "" 
    cout << '"' << lval << '"' << endl; // "" 
    cout << '"' << s << '"' << endl; // "" 
    cout << '"' << s2 << '"' << endl; // "my string" 
    return 0; 
} 
+0

我想添加'''string&lval = rval; cout <<'''<< lval <<'“'<< endl; //“我的字符串”'''这个例子对我来说会更有帮助。这是否意味着r ref可以隐式转换为l ref?然而,相反是错误的,因为我需要明确地说移动(S)转换一个RE参考R ref? –

+0

@云生宝:你是对的 – Dani

+0

“一旦移动构造函数被调用引用,原始对象应该被重置为原始状态”这并不保证以这种方式工作。 – cpplearner