在这次初始化中创建了多少个临时对象?

How many temporary objects are created in this initialization?

我有这个初始化:

const char* str = std::string("a").c_str();

这次初始化创建了多少个临时对象?

可以"a"被认为是临时工吗?对象?

我知道std::string("a")是临时工。对象。

c_str()的结果是一个对象,str存储它。所以不是临时工。对象,对吗?

只有一个。字符串.

"a"是一个字面量,其类型是const char[]适当的大小,它有一个静态存储。所以,这肯定不是临时的。

strc_str() 的 return 值也是 const char 指针。

没有创建其他对象。

"a"const char[2] 类型的字符串文字,所以它是一个对象。

std::string("a") 是一个纯右值表达式并且不是一个临时对象(还)。当您调用 c_str() 时,您会具体化一个临时对象并在其上调用 c_str() 以获取指向临时对象数据的指针。

然后您将指针的地址分配给 str 所以现在 str 保存指向临时对象数据的指针的地址。在该完整表达式的末尾,具体化的临时对象被销毁,使该临时数据的 iterators/pointers/references 无效。

这意味着 str 现在指向您不再拥有的内存,称为悬挂指针。除了给它分配一个不同的地址之外,对它做任何事情都是未定义的行为。

所以当它全部结束时你有 2 个对象。悬空指针 (str) 和字符串文字 ("a").

Can "a" be considered an temp. object?

技术上,定义不明确

没有有定义的生命周期。从技术上讲,使用它确实 not 具有定义的行为。 不是构造正式开始一个对象的生命周期。

在实践中你可以使用它(很明显)。