在这次初始化中创建了多少个临时对象?
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[]
适当的大小,它有一个静态存储。所以,这肯定不是临时的。
str
和 c_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 具有定义的行为。 不是构造正式开始一个对象的生命周期。
在实践中你可以使用它(很明显)。
我有这个初始化:
const char* str = std::string("a").c_str();
这次初始化创建了多少个临时对象?
可以"a"
被认为是临时工吗?对象?
我知道std::string("a")
是临时工。对象。
c_str()
的结果是一个对象,str
存储它。所以不是临时工。对象,对吗?
只有一个。字符串.
"a"
是一个字面量,其类型是const char[]
适当的大小,它有一个静态存储。所以,这肯定不是临时的。
str
和 c_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 具有定义的行为。 不是构造正式开始一个对象的生命周期。
在实践中你可以使用它(很明显)。