【问题标题】:C++: rvalue reference converted to non-const lvalue-referenceC++:右值引用转换为非常量左值引用
【发布时间】:2016-06-19 16:54:55
【问题描述】:

我已经阅读了thisthis,但是我仍然不明白为什么下面的代码会在 XCode 中编译:

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

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

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

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

【问题讨论】:

  • string &&s s 是一个可以绑定到左值引用的左值。
  • 我认为s 是一个右值引用。为什么它是左值?是不是因为它有同一性,它是可移动的?如果是这样,它们之间有什么区别?谢谢!
  • 记住,如果一个对象有名字,它就是一个左值

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


【解决方案1】:

右值引用是对原始对象的引用,因此将其转换为左值引用只会引用原始对象。
一旦在引用上调用了移动构造函数,原始对象应该被重置为原始状态,对它的任何引用也是如此。

这个例子可能会澄清它:

#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;
}

【讨论】:

  • 我认为在示例中添加string &amp;lval = rval; cout &lt;&lt; '"' &lt;&lt; lval &lt;&lt; '"' &lt;&lt; endl; // "my string" 会更有助于我理解。这是否意味着可以将 r ref 隐式转换为 l ref?但是,相反的情况是错误的,因为我需要明确地说 move(s) 才能将 l ref 转换为 r ref?
  • “一旦在引用上调用移动构造函数,原始对象应重置为原始状态”不能保证以这种方式工作。
猜你喜欢
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2013-08-01
相关资源
最近更新 更多