理解返回字符串引用的函数中的"const"

Jul*_*ian 0 c++ reference constants

我有这个代码:

#include <cstdio>
#include <string>

using namespace std;

const string & func()
{
    static string staticString = "one";
    printf("%s\n", staticString.c_str());
    return staticString;
}

int main( int argc, char ** argv )
{
    string firstString = func();
    firstString = "two";
    printf("%s\n", firstString.c_str());
    func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

one
two
one
Run Code Online (Sandbox Code Playgroud)

困惑我的部分是,如果我constfunc()输出中删除是完全相同的.我期望它是:

one
two
two
Run Code Online (Sandbox Code Playgroud)

如果我从中获取字符串引用func()(当它没有const关键字时),为什么在我func()再次调用时它被重置?

Bri*_*ian 5

string firstString = func();
Run Code Online (Sandbox Code Playgroud)

您正在复制返回的字符串(通过引用)firstString,因此您所做的更改firstString不应影响静态本地.如果你这样做:

const string& firstString = func();
Run Code Online (Sandbox Code Playgroud)

你将参考它,并看到你不允许修改它.如果您更改func()为返回string&并且firstString是类型string&,那么您修改内部的字符串func().