在此初始化中创建的临时对象数
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[2]
的字符串文字,因此它是一个对象。
std::string("a")
是一个 prvalue 表达式,还不是临时对象。 调用c_str()
时,将具体化临时对象并调用c_str()
,以获取指向临时对象数据的指针。
然后,将指针的地址分配给str
以便现在str
将地址保存到指向临时对象数据的指针。 在该完整表达式结束时,将销毁物化的临时对象,使对该临时数据的迭代器/指针/引用无效。
这意味着str
现在指向您不再拥有的内存,称为悬空指针。 对它执行任何操作,除了为其分配不同的地址之外,都是未定义的行为。
所以当它全部结束时,你有 2 个对象。 一个悬空指针 ( str
( 和一个字符串文本 ( "a"
(。
只有一个
。字符串。
"a"
是文字,其类型const char[]
适当的大小,它具有静态存储。所以,这肯定不是暂时的。
str
和返回值 c_str()
也是const char
指针。
不会创建其他对象。
"a"
可以被视为临时对象吗?
从技术上讲,它没有很好的定义。
它没有定义的生存期。从技术上讲,使用它没有定义的行为。它不是正式开始对象生存期的构造。
在实践中,您可以使用它(显然(。
相关文章:
- 为什么当我们有常量引用时创建临时对象?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 将项添加到矢量而不创建临时对象
- 在此初始化中创建的临时对象数
- 在没有返回值优化的情况下将两个对象加在一起时,将创建多少个临时对象
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 按值函数创建范围的临时对象
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- 临时对象创建
- 我如何知道何时创建和销毁临时对象
- C++矢量推回方法和临时对象创建
- 当我从内联函数返回字符串时,会创建多少个临时对象
- 我应该创建一个临时对象来实例化C++中的成员变量吗
- Visual Studio 在类型转换时不会创建临时对象
- 如何避免在使用初始值设定项列表构造时创建(和删除)临时对象
- 通过引用捕获异常时未创建临时对象
- 临时对象 - 何时创建它们,如何在代码中识别它们
- 何时调用使用"new"创建的临时对象'delete'?