字符串常量在c ++中存在多长时间?

SiL*_*hon 5 c++ pointers constants string-literals object-lifetime

我一直想知道,C++中的字符串常量有多长.例如,如果我在函数内部创建了一些const char*str ="something",那么返回str的值是否安全?

我写了一个示例程序,看到这样的返回值仍然存储了该字符串,我感到非常惊讶.这是代码:

#include <iostream>
using namespace std;

const char *func1()
{
    const char *c = "I am a string too";
    return c;
}

void func2(const char *c = "I'm a default string")
{
    cout << c << endl;
}

const int *func3()
{
    const int &b = 10;
    return &b;
}

int main()
{
    const char *c = "I'm a string";
    cout << c << endl;
    cout << func1() << endl;
    func2();
    func2("I'm not a default string");
    cout << *func3() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下输出:

我是一个字符串

我也是一个字符串

我是默认字符串

我不是默认字符串

10

func3只是为了找出它是否适用于其他类型.
所以问题是:返回指向该函数内创建的字符串常量的指针是否安全(如func1())?
另外,使用func2()中的默认字符串值是否安全?

Sha*_*our 11

字符串文字具有静态存储持续时间并且持续程序的生命周期.从草案C++标准部分2.14.5 字符串文字8段说(强调我的前进):

普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n const char数组",其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7).

从章节3.7.1 静态存储期限1段:

所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续到程序的持续时间(3.6.2,3.6.3).

func3另一方面,第二种情况无效.临时绑定到引用的生命周期在引用的生命周期中持续存在,在这种情况下,在函数返回时结束.这部分12.2将在以下部分中介绍:

第二个上下文是引用绑定到临时的.115引用绑定的临时值或作为引用绑定的子对象的完整对象的临时值在引用的生命周期内持续存在,除了: