C ++:rvalue引用转换为非const lvalue-reference

时间:2016-06-19 16:54:55

标签: c++ c++11 pass-by-reference c++14

我已阅读thisthis,但我仍然不明白为什么以下代码在XCode中编译:

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

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

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

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

1 个答案:

答案 0 :(得分: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;
}