返回引用类型和复制对象

时间:2013-02-19 22:15:19

标签: c++ string copy

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

以下是您需要考虑的一些代码:我将要解决的问题是什么?

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

在主要内部:

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

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

2 个答案:

答案 0 :(得分:3)

const char表示的"end"数组将转换为std::string类型的临时对象。 EnglishTranslate返回后,该临时表将被销毁。这使得返回的引用悬空,而不是指向有效的对象。

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

我建议改为按值返回:

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

不要担心复制到返回值 - 允许编译器完全删除副本。

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

答案 1 :(得分:2)

  

我要做什么问题?

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

  

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

因此,您的函数返回的引用是悬空的,并且在解除引用时您有未定义的行为