返回引用和复制对象的类型
Return type of reference and copying object
如果我返回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语句中的完整表达式末尾被销毁。
因此,函数返回的引用是悬空的,并且在取消引用时具有未定义的行为。
相关文章:
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息