按值返回到右值引用
Returning by value to 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"(这是由于右值->指针转换引起的常量字符*吗?)
- 字符串对象是隐式构造的(使用哪个ctor?)
- 由于引用崩溃规则,它被绑定到"无危险"(这与字符串和普通引用的行为有什么不同吗?)
func()
函数返回一个std::string
prvalue。用于构造std::string
的构造函数是
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
此prvalue绑定到右值引用nodanger
,后者将延长其生存期以匹配引用本身的生存期。引用崩溃在这里不起作用。
这与
string&
正常引用有什么不同吗?
如果nodanger
是string&
,则代码不会编译,因为不能将右值绑定到非const
左值引用。您的示例中的寿命延长行为与以下情况相同
std::string const& nodanger = func();
这里肯定有很多混乱。我假设middle_name()
应该是func()
。
问题是:func()返回什么?
它返回一个string
(我假设它是std::string
)。此返回对象使用表达式"Paul"
初始化,该表达式的类型为"array of 5const
char
"。使用的构造函数如下:
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
左值引用无法绑定到右值表达式。
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量