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

时间:2019-04-26 12:19:49

标签: c++ temporary-objects

我有这个初始化:

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

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

可以将"a"视为临时的。对象?

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

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

3 个答案:

答案 0 :(得分:6)

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

std::string("a")是一个prvalue表达式,不是一个临时对象(尚未)。调用c_str()时,将物化一个临时对象并对其调用c_str(),以获得指向临时对象数据的指针。

然后您将指针的地址分配给str,因此现在str将地址保存到指向临时对象数据的指针。在该完整表达式的末尾,实体化的临时对象被破坏,从而使对该临时数据的迭代器/指针/引用无效。

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

因此,当结束时,您将拥有2个对象。悬空指针(str)和字符串文字("a")。

答案 1 :(得分:-2)

只有一个。字符串。

"a"是一个文字,类型为const char[],大小合适,具有静态存储。因此,这肯定不是临时的。

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

没有创建其他对象。

答案 2 :(得分:-3)

  

可以将"a"视为临时的。对象?

从技术上讲,定义不明确

没有没有定义的生存期。从技术上讲, not 并没有定义行为。正式开始对象生命周期的并不是构造的

实际上,您可以使用它(显然)。