操作员+序列内的临时寿命
Lifetime of temporary within operator+ sequence
可能重复:
在C++中保证临时的使用寿命
临时期限
我有一个关于从重载的operator+
方法返回的临时对象的寿命的快速问题。例如,如果表达式。。。
a = b + c + d + e
由返回临时对象的重载operator+
方法计算,子表达式b + c
返回的临时的范围是整个表达式的范围吗?
由于g++似乎保留了所有临时值,而整个表达式都在范围内,因此在a =
赋值期间,可能会保留对这些值的引用以进行延迟求值。
有人能确认一下这种行为是否对所有C++实现都有保证吗?
是的,在通常的情况下:"临时对象作为评估的最后一步被销毁完整的表达式(1.9((从词汇上(包含它们的创建点。"(§12.2/3(.
有几个例外,但它们不适用于这里。
是的,只有在完整表达式中的所有求值之后,才会销毁临时对象。(语句是最常见的完整表达式。某些引用的使用会使临时对象持续更长时间。(
这可能有点偏离主题,但G++(MinGW 4.4.1(和MSCV++10在堆栈上创建的返回临时变量的范围方面存在差异。
我刚刚创建了一个对象,名为say myObj,类成员是坐标、向量等等。。。
该类有一个默认构造函数、另一个初始化类成员的构造函数、一个复制构造函数以及重载的+、+=和=运算符。
myObj & myObj::operator+(myObj & mO)
{
myObj retO = myObj(mO); // using a non-default constructor defined
retO += *this; // Uses the other overloaded operator defined.
return retO;
}
+运算符在堆栈上分配一个myObj对象(不使用new(,并添加对象*this和mO(通过retO(,并将它们分配给在堆栈上创建的retO对象。
G++允许您拨打:
myObj2 = myObj1 + myObj2;
但是,Visual Studio 10.0会在重载运算符成员函数退出后立即销毁在堆栈上创建的retO(使用静态成员增量和减量以及所有构造函数和析构函数内的输出进行验证(。
我不知道标准是如何定义这种行为的。奇怪的是,MinGW会发出编译器警告,而MSVC++10则不会。
当然,使用new关键字创建新的myObj对象的问题是内存泄漏,因为上面的构造没有保留对分配给myObj2的新myObj实例化的引用。
问候,
导航
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C++操作员订单评估
- 如何强制新操作员根据我的需要解释语句