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

时间:2015-03-26 12:23:07

标签: c++ temporary-objects

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

  

也引用普通的字符串文字和UTF-8字符串文字   作为窄字符串文字。窄字符串文字的类型为“数组”   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;
}

那两者有什么区别?

3 个答案:

答案 0 :(得分:10)

您发布的报价说明

  

窄字符串文字的类型为“n const char数组”

"Hello"的类型为const char[6]

您的代码正在返回对const char *的引用。这意味着必须将数组到指针的转换应用于字符串文字,从而产生类型为const char *的prvalue(= temporary)。然后,将其绑定到引用并返回该引用。一旦函数的作用域结束并且临时指针被销毁,引用就会变为悬空。

答案 1 :(得分:8)

没有区别。在这两种情况下,都会返回对不再存在的指针的引用。

指针(数据)永远存在是无关紧要的。

答案 2 :(得分:2)

const char* const & s = "Hello";

这里变量是在堆栈上创建的......而 变量(恰好是一个指针)指向一个内存位置,其中string-literal是存储。您返回字符串文字本身;因为堆栈展开,你很快就会销毁对变量的引用。因此,返回对这样一个变量的引用是危险的,因为它是一个临时对象。