常规字符串字符串文字具有以下定义:
也引用普通的字符串文字和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;
}
那两者有什么区别?
答案 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是存储。您不返回字符串文字本身;因为堆栈展开,你很快就会销毁对变量的引用。因此,返回对这样一个变量的引用是危险的,因为它是一个临时对象。