在此初始化中创建的临时对象数

How many temporary objects are created in this initialization?

本文关键字:临时对象 创建 初始化      更新时间:2023-10-16

我有这个初始化:

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

在此初始化中创建多少个临时对象?

"a"可以被视为临时对象吗?

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

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

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

std::string("a")是一个 prvalue 表达式,还不是临时对象。 调用c_str()时,将具体化临时对象并调用c_str(),以获取指向临时对象数据的指针。

然后,将指针的地址分配给str以便现在str将地址保存到指向临时对象数据的指针。 在该完整表达式结束时,将销毁物化的临时对象,使对该临时数据的迭代器/指针/引用无效。

这意味着str现在指向您不再拥有的内存,称为悬空指针。 对它执行任何操作,除了为其分配不同的地址之外,都是未定义的行为。

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

只有一个

。字符串。

"a"是文字,其类型const char[]适当的大小,它具有静态存储。所以,这肯定不是暂时的。

str 和返回值 c_str() 也是const char指针。

不会创建其他对象。

"a"可以被视为临时对象吗?

从技术上讲,它没有很好的定义

没有定义的生存期。从技术上讲,使用它没有定义的行为。它不是正式开始对象生存期的构造。

在实践中,您可以使用它(显然(。