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

Joã*_*ulo 1 c++ temporary-objects

我有这个初始化:

const char* str = std::string("a").c_str();
Run Code Online (Sandbox Code Playgroud)

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

可以"a"算是临时的。宾语?

我知道std::string("a")是临时的。宾语。

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

Nat*_*ica 6

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

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

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

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

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