【问题标题】:Why is returning a reference to a string literal a reference to a temporary?为什么返回对字符串文字的引用是对临时的引用?
【发布时间】:2015-05-30 11:07:14
【问题描述】:

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

普通字符串字面量和 UTF-8 字符串字面量也被引用 作为窄字符串文字。窄字符串文字的类型为“数组 n const char”,其中 n 是字符串的大小,定义如下, 并具有静态存储持续时间 (3.7)。

我假设因为它具有静态存储持续时间并且它们通常放置在 ROM 中,所以如果有对它的悬空引用真的没什么大不了的。以下代码发出警告

const char* const & foo()
{
    return "Hello";
}
// warning: returning reference to temporary [-Wreturn-local-addr]

但这很好,即使没有 static 关键字

const char* const & foo()
{
    const char* const & s = "Hello";
    return s;
}

那么这两者有什么区别呢?

【问题讨论】:

  • 您的代码没有返回对字符串文字的引用。它返回对指针的引用。您引用的大部分内容与代码无关。
  • 你的引用来自哪里?你应该添加它。
  • 为什么要返回对字符指针的引用而不是字符指针本身?

标签: c++ temporary-objects


【解决方案1】:

你发布的报价是这样说的

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

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

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

【讨论】:

    【解决方案2】:

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

    pointee(数据)仍然永远存在是无关紧要的。

    【讨论】:

      【解决方案3】:
      const char* const & s = "Hello";
      

      这里 variable 是在堆栈上创建的......并且 that 变量(恰好是一个指针)指向字符串文字所在的内存位置存储。您返回字符串文字本身;您宁愿返回对变量的引用,由于堆栈展开,该引用将很快被销毁。因此,返回对此类变量的引用是危险的,因为它是一个临时对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 2012-11-20
        相关资源
        最近更新 更多