C++ 按值返回到右值引用

C++ 按值返回到右值引用,c++,c++11,rvalue-reference,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()返回什么 我相信会发生这样的事情: fu

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

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”(这是由于右值->指针转换导致的常量字符*)
  • 字符串对象是隐式构造的(使用哪一个构造函数?)
  • 由于引用折叠规则,它被绑定到“nodanger”(这与字符串和普通引用的行为有什么不同吗?)
您的
func()
函数返回一个
std::string
prvalue。用于构造
std::string

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );
此PR值绑定到右值引用
nodanger
,从而延长其生存期以匹配引用本身的生存期。引用崩溃在这里不起作用

这与
字符串&
普通引用的行为有什么不同吗

如果
nodanger
字符串&
,则代码不会编译,因为不能将右值绑定到非
常量
左值引用。示例中的生存期扩展行为与以下情况相同

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

这里肯定有很多混乱。我假设
middle\u name()
应该是
func()

问题是:func()返回什么

它返回一个
字符串
(我假设它是
std::string
)。此返回对象使用表达式
“Paul”
初始化,该表达式的类型为“array of 5
const
char
”。使用的构造函数如下所示:

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );
要调用此函数,字符串文本必须进行隐式数组到指针的转换(将我们从
常量字符[5]
转换为
常量字符*

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

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

说“返回prvalue”没有意义。“prvalue”不是对象或类型,“prvalue”是表达式的一个类别。调用
func
的表达式是prvalue


右值引用绑定到从函数返回的
std::string
对象。这里没有发生引用折叠。如果引用是左值引用,则您的代码将无法编译,因为非
const
左值引用无法绑定到右值表达式。

这甚至无法编译。什么是
middle\u name()
?您在哪里返回右值引用?
func()
只是按值返回一个字符串,因此没有右值引用。请看这篇关于的文章。像往常一样,Alex Allain写了一篇超级文章。这对我帮助很大。