按值返回到右值引用

Returning by value to rvalue reference

本文关键字:引用 返回      更新时间:2023-10-16

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

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"(这是由于右值->指针转换引起的常量字符*吗?)
  • 字符串对象是隐式构造的(使用哪个ctor?)
  • 由于引用崩溃规则,它被绑定到"无危险"(这与字符串和普通引用的行为有什么不同吗?)

func()函数返回一个std::stringprvalue。用于构造std::string的构造函数是

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

此prvalue绑定到右值引用nodanger,后者将延长其生存期以匹配引用本身的生存期。引用崩溃在这里不起作用。

这与string&正常引用有什么不同吗?

如果nodangerstring&,则代码不会编译,因为不能将右值绑定到非const左值引用。您的示例中的寿命延长行为与以下情况相同

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

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

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

它返回一个string(我假设它是std::string)。此返回对象使用表达式"Paul"初始化,该表达式的类型为"array of 5constchar"。使用的构造函数如下:

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

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

表达式func()是一个prvalue表达式(右值表达式的子集),因为它按值返回。以下是标准对此的定义:

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

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

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