返回引用和复制对象的类型

Return type of reference and copying object

本文关键字:类型 对象 复制 引用 返回      更新时间:2023-10-16

如果我返回std::string&从一个函数,返回类型是赋值的右值,我从GCC得到一条警告消息。这是因为通过引用传递不会正确复制吗?该错误表示我正在传递一个临时值,因为它很快就会从堆栈中删除。

这里有一些代码供您考虑:我要做的是一个问题吗?

const std::string& TranslationTable::EnglishTranslate()
{
    return "end";
}

和内部主要:

std::string me;
me = EnglishTranslate();

返回字符串的内容是否会正确复制到me中?

"end"表示的const char数组被转换为std::string类型的临时对象。一旦EnglishTranslate返回,该临时文件就会被销毁。这使得返回的引用处于悬空状态,而不是指向有效的对象。

将返回的引用传递给me的复制赋值操作符将导致未定义的行为(假设操作符被定义为执行它应该执行的操作)。

我建议按值返回:

std::string TranslationTable::EnglishTranslate()
{
    return "end";
}

不要担心返回值的副本-编译器可以完全删除副本。

从函数返回引用的唯一真正常见用途是返回对数据成员的引用。与局部变量不同,数据成员不会在函数结束时被销毁。有关示例,请参见std::vector::operator[]

我要做的是一个问题吗?

根据C++11标准第12.2/5段:

函数返回语句(6.6.3)中返回值的临时绑定的生存期不是扩展临时在return语句中的完整表达式末尾被销毁

因此,函数返回的引用是悬空的,并且在取消引用时具有未定义的行为