按值返回到右值引用

时间:2015-04-23 13:47:31

标签: c++ c++11 rvalue-reference

我正在研究右值参考,我对以下代码有疑问:

string func() {
    return "Paul";
}

int main()
{
    string&& nodanger = func();
    // The lifetime of the temporary is extended
    // to the life-time of the reference.
    return 0;
}

问题是:func()返回什么?

我相信这就是:

  • func返回一个prvalue" Paul" (由于rvalue->指针转换,这是一个const char *吗?)
  • 隐式构造一个字符串对象(使用ctor?)
  • 由于参考折叠规则,它必然会被" nodanger" (这与字符串和正常引用有什么不同吗?)

2 个答案:

答案 0 :(得分:7)

您的func()函数返回std::string prvalue。用于构建std::string的{​​{3}}是

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

这个prvalue绑定到右值引用nodanger,它延长了它的生命周期以匹配引用本身的生命周期。参考折叠在这里没有发挥作用。

  

这与string&普通参考有什么不同吗?

如果nodangerstring&,代码将无法编译,因为您无法将rvalues绑定到非const左值引用。示例中的生命周期扩展行为与以下情况相同

std::string const& nodanger = func();

答案 1 :(得分:2)

这里肯定有很多混乱。我假设middle_name()应该是func()

  

问题是:func()返回什么?

它返回string(我假设它是std::string)。此返回对象使用表达式"Paul"进行初始化,其类型为"数组为const char"。使用的构造函数如下:

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

要调用此函数,字符串文字必须进行隐式数组到指针转换(将我们从const char[5]带到const char*

表达式func()是prvalue表达式(rvalue表达式的子集),因为它按值返回。以下是标准如何定义:

  

如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值;如果结果类型是对象类型的右值引用,则为xvalue,否则为prvalue。

说"返回prvalue"是没有意义的。 A" prvalue"不是对象或类型。它是一种表达方式。调用func的表达式是prvalue。

rvalue引用绑定到从函数返回的std::string对象。这里没有参考崩溃。如果引用是左值引用,则代码将无法编译,因为非const左值引用不能绑定到右值表达式。