如果我返回一个std :: string&从函数中,返回类型是赋值的右值,我从GCC收到一条警告消息。这是因为通过引用传递不会正确复制吗?该错误表明我正在传递一个临时值,因为它很快就会从堆栈中删除。
以下是您需要考虑的一些代码:我将要解决的问题是什么?
const std::string& TranslationTable::EnglishTranslate()
{
return "end";
}
在主要内部:
std::string me;
me = EnglishTranslate();
返回的字符串的内容是否会正确复制到me
?
答案 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语句中的完整表达式结束时被销毁。
因此,您的函数返回的引用是悬空的,并且在解除引用时您有未定义的行为。