为什么返回对字符串文字的引用就是对临时的引用
Why is returning a reference to a string literal a reference to a temporary?
常规字符串文本具有以下定义:
还引用了普通字符串文字和UTF-8字符串文字到作为窄字符串文字。窄字符串文字的类型为"array"of n const char",其中n是如下定义的字符串的大小,并且具有静态存储持续时间(3.7)
我假设,因为它有静态存储持续时间,而且它们通常放在ROM中,如果有一个悬挂的引用,那真的没什么大不了的
const char* const & foo()
{
return "Hello";
}
// warning: returning reference to temporary [-Wreturn-local-addr]
但这是好的,即使没有静态关键字
const char* const & foo()
{
const char* const & s = "Hello";
return s;
}
那么两者之间有什么区别呢?
你发布的报价说
窄字符串文字的类型为"array of n const char"
也就是说,"Hello"
的类型是const char[6]
。
您的代码正在返回对const char *
的引用。这意味着数组到指针的转换必须应用于字符串文字,从而产生类型为const char *
的prvalue(=临时)。然后将其绑定到引用并返回该引用。一旦函数的作用域结束并且临时指针被销毁,引用就变为悬空。
没有区别。在这两种情况下,都会返回对已不存在的指针的引用。
指针对象(数据)仍然永远存在是无关紧要的。
const char* const & s = "Hello";
在这里,变量是在堆栈上创建的。。。那个变量(恰好是一个指针)指向存储字符串文字的内存位置。您不是返回字符串文字本身;您所返回的对变量的引用将在堆栈展开后立即被销毁。因此,返回对这样一个变量的引用是危险的,因为它是一个临时对象。
相关文章:
- 如何通过引用返回对象
- 函数如何使用引用返回所需的数字?
- 如何防止引用返回的私有结构的突变
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 通过引用返回的变量的范围
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 运算符重载C++类中的引用返回
- C++对象引用返回不同的值
- 解释通过从函数引用返回数组的语法
- 具有引用返回类型的重写方法上的协变返回类型无效
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 为什么我在函数中使用引用并通过引用返回它仍然有效?
- 直接在 C++ 中将值分配给引用返回类型
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 可以通过常量引用返回默认参数的值吗?
- 按值与右值引用返回
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 当我使用按引用返回时,我不知道这些代码之间的区别
- 为什么通过引用返回向量比通过移动返回要快得多?
- 通过引用返回包含对象的向量