我正在研究右值参考,我对以下代码有疑问:
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()
返回什么?
我相信这就是:
答案 0 :(得分:7)
您的func()
函数返回std::string
prvalue。用于构建std::string
的{{3}}是
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
这个prvalue绑定到右值引用nodanger
,它延长了它的生命周期以匹配引用本身的生命周期。参考折叠在这里没有发挥作用。
这与
string&
普通参考有什么不同吗?
如果nodanger
是string&
,代码将无法编译,因为您无法将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
左值引用不能绑定到右值表达式。