为什么返回对字符串文字的引用就是对临时的引用

Why is returning a reference to a string literal a reference to a temporary?

本文关键字:引用 返回 文字 为什么 字符串      更新时间:2023-10-16

常规字符串文本具有以下定义:

还引用了普通字符串文字和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";

在这里,变量是在堆栈上创建的。。。那个变量(恰好是一个指针)指向存储字符串文字的内存位置。您不是返回字符串文字本身;您所返回的对变量的引用将在堆栈展开后立即被销毁。因此,返回对这样一个变量的引用是危险的,因为它是一个临时对象。