为啥以 const char* 返回时会在此处创建临时字符串? [Stroustrup 的书例]

Posted

技术标签:

【中文标题】为啥以 const char* 返回时会在此处创建临时字符串? [Stroustrup 的书例]【英文标题】:Why are temporary strings created here when returned as const char* ? [Stroustrup's book example]为什么以 const char* 返回时会在此处创建临时字符串? [Stroustrup 的书例] 【发布时间】:2019-01-11 05:56:10 【问题描述】:

我试图从初学者的书中理解以下代码。 (编辑:'programming principle and practice using c++' page 1085)我不太明白为什么临时字符串是根据 cmets 制作的。

const char* string_tbl[ ] =  "Mozart", "Grieg", "Haydn", "Chopin" ;
const char* f(int i)  return string_tbl[i]; 
void g(string s)

void h()

    const string& r = f(0);  // bind temporary string to r
    g(f(1));                 // make a temporary string and pass it
    string s = f(2);         // initialize s from temporary string
    cout << "f(3): " << f(3) // make a temporary string and pass it
    <<" s: " << s
    << " r: " << r << '\n';

f() 返回一个指向 const char 的指针,对吧?

不应该const string&amp; r = f(0); 将'pointer to char'(在这种情况下是全局数组中的字符串文字)分配给引用变量,以便可以使用 r[] 等访问(只读)原始变量?

g(f(1)); 传递一个指向g() 的指针,然后用指针初始化string s

我错过了什么? const char* 从函数返回时总是产生一个临时字符串吗?

【问题讨论】:

rstd::string 引用,而不是 char *(忽略 const)。您如何将“指向 char 的指针”分配给不属于该类型的东西? 不,这本书是正确的。我很确定周围的文字会解释代码。 哪本书是“Stroustrup 的书”?他写过不止一篇。 对不起,我认为'初学者的书'会说清楚。这是“使用 C++ 的编程原理和实践”第 1085 页 【参考方案1】:

有一个隐式转换,代码

string s = f(2);

等于

string s = string(f(2));

【讨论】:

【参考方案2】:

我不太明白为什么要根据 cmets 制作临时字符串。

问题在于char const*std::string 是完全不同的数据类型。

比较:

class A  ;
class B  ;
void f(A a);
void g()

    B b;
    f(b); // does not work...

我很确定你已经遇到过。

现在让我们更改 A 类:

class A

public:
    A()      // default constructor
    A(B b)   // accepting an instance of B
;

现在,你可以这样做了:

B b;
f(A(b)); // create a TEMPORARY A from B; you need it, as f ONLY accepts an A!
f(b);    // again, create a temporary just as before - this time IMPLICITLY

您可以通过使构造函数显式来禁止从B隐式创建A:

class A

public:
    A()  
    explicit A(B b)   // now A cannot be created implicitly any more
;

B b;
//f(b);  // now is not accepted by compiler any more
f(A(b)); // this still works, of course

std::string 完全相同:它有一个接受char const* 的非显式构造函数...

【讨论】:

以上是关于为啥以 const char* 返回时会在此处创建临时字符串? [Stroustrup 的书例]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以从 char * const 值创建 char * 向量?

为啥 const QString& 参数返回错误的 const char* 指向数据的指针

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

为啥在我创建新项目时会在 android studio 中出现此错误?

返回本地创建的 const char*

为啥 sip 在使用 char * 时会抱怨意外类型“str”?