为啥以 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& r = f(0);
将'pointer to char'(在这种情况下是全局数组中的字符串文字)分配给引用变量,以便可以使用 r[] 等访问(只读)原始变量?
和g(f(1));
传递一个指向g()
的指针,然后用指针初始化string s
?
我错过了什么? const char* 从函数返回时总是产生一个临时字符串吗?
【问题讨论】:
r
是 std::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* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]