0

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

这里有一些代码供您考虑:我要做什么有问题吗?

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

内部主要:

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

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

4

2 回答 2

3

const char由表示的数组"end"被转换为类型的临时对象std::string。那个临时的一EnglishTranslate回来就被销毁了。这会使返回的引用悬空,而不是指向有效的对象。

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

我建议改为按值返回:

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

不要担心返回值的复制——编译器可以完全删除复制。

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

于 2013-02-19T22:18:06.577 回答
2

我要做的事情有问题吗?

是的。

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

临时绑定到函数返回语句 (6.6.3) 中的返回值的生命周期不会延长;临时在 return 语句中的完整表达式结束时被销毁

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

于 2013-02-19T22:21:18.070 回答