我有这个初始化:
const char* str = std::string("a").c_str();
在此初始化中创建了多少个临时对象?
可以将"a"
视为临时的。对象?
我知道std::string("a")
是临时的。对象。
c_str()
的结果是一个对象,str
将其存储。所以这不是临时的。对象,对吧?
答案 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 并没有定义行为。正式开始对象生命周期的并不是构造的 。
实际上,您可以使用它(显然)。