问题标签 [temporary-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 返回值优化的步骤
可能重复:
了解返回值优化和返回临时值 - C++
让我们Integer
成为某个班级i
的成员。left
并且right
作为参数传递给函数调用并且是类型Integer
现在正如 Bruce Eckel 中给出的那样。
代码 1:
代码 2:
代码 1 说创建一个临时整数对象并返回它,它不同于创建一个命名的局部变量并返回它,这是一个普遍的误解。
在代码 1 中(称为返回临时方法):
编译器知道您对它创建的对象没有其他需要,然后返回它。编译器通过building the object directly into the location of the outside return value
. 这只需要一个普通的构造函数调用(没有复制构造函数)并且不需要析构函数,因为没有创建本地对象。
虽然代码 2 中会发生 3 件事:
a) 创建 tmp 对象,包括其构造函数调用
b) the copy-constructor copies the tmp to the location of the outside return value
。
c) 在作用域结束时为 tmp 调用析构函数。
在代码 1 中这是什么意思:building the object directly into the location of the outside return value
?
还有为什么在代码 1 中不会调用复制构造函数?
另外我不明白代码2中的步骤b在做什么?即the copy-constructor copies the tmp to the location of the outside return value
。
c++ - 如何允许临时的非常量复制构造函数
如何允许具有复制构造函数的类从临时对象中复制构造,该复制构造函数采用非常量引用?
背景是这样的:
我有一个函数应该返回一个指向所有从 Base 继承的对象的指针列表,所以我需要类似vector<Base*>
. 鉴于这vector<auto_ptr>
不是一个很好的选择,我想编写一个简单的包装器vector<Base*>
来删除其析构函数中的所有元素。
我面临以下问题:
我的类有一个复制构造函数,如下所示:
这样我就可以将指针列表复制到新实例并在旧实例中清除它。
但显然,这不适用于返回值,因为临时对象不绑定到非常量引用。看到函数可以返回auto_ptr,它们是怎么实现的呢?
注意:我不能使用 C++11 或 boost,因此不能选择移动语义或 unique_ptr。
如果有帮助,这是我到目前为止的代码:
c++ - 向量::交换和临时对象
代码如下:
上面的代码无法编译,错误:
但是,如果我将代码更改为这样的代码,它可以编译:
为什么?
c++ - 临时对象未正确销毁?
在此处查看此代码:
在这个程序中,编译器应该抱怨重复删除j
. 第一次删除是在临时对象temporary(123)
被销毁时完成的。第二次删除是在var
对象被销毁时完成的。但这工作正常吗?
这是否意味着临时对象不调用析构函数?
c++ - 返回值总是暂时的吗?
这个页面说了一件奇怪的事情:-
仅当您的程序不将返回值复制到对象时才会创建临时对象,并且给出的示例是
但如果我已经完成了:-
在我看来,它还将创建一个临时文件,如下所示:-
Func()
构造一个本地对象。接下来,在调用者的堆栈上复制构造这个本地对象,将 atemporary object
用作 obj 的复制构造函数的参数。
我错了吗?
这与复制省略有关吗?
python - Python中是否会自动清除临时引用?
这基本上是一个关于临时工寿命的问题。如果函数返回一个对象,但是引用并没有赋值给变量,只是用来调用返回对象的方法,临时引用会自动清除吗?
举一个具体的例子,假设有这个方法调用链:
o.method_a()
调用完成时自动清除返回的临时引用method_b()
,就好像该行写成这样:
编辑:我对一般答案感兴趣。一旦引用计数下降到 0,CPython 就会终止对象。其他 Python 实现可能不会立即终止对象。我想知道 Python 语言是否像 C++ 一样,它保证临时对象在创建它们的语句结束时被销毁。(除了在 Python 中,问题是临时引用是否在创建它们的语句结束时被清除。)
在 C++ 中,类似的代码可以通过以下方式实现:
C++ 标准规定“临时对象被销毁作为评估完整表达式的最后一步......(在词法上)包含创建它们的点。即使评估以抛出异常结束也是如此。” 在此示例中,这意味着std::shared_ptr<B>
调用创建的临时对象A::method_a()
会在 full-expression 的计算结束时立即销毁o.method_a()->method_b();
。销毁 astd::shared_ptr
意味着清除对共享对象的引用。
c++ - 临时对象存储在哪里?
临时对象是否存储在动态(堆)内存中?
c++ - 何时将临时用作命名对象的初始化程序?
在“C++ 编程语言(第 3 版)”第 255 页中:
临时可以用作 const 引用或命名对象的初始化程序。例如:
这可以。当“它的”引用或命名对象超出范围时,临时对象被销毁。
他是说创建的临时对象在超出范围s1+s2
时被销毁吗?ss
复制初始化后它不会被销毁ss
吗?
c++ - 杂项临时对象 T()
考虑这段代码:
我发现 的值为j
1,但这应该是 0,因为int()
它是一个值等于 0 的临时值。
此外,运算符的语法new
是new typename
,但这里T()
将是一个临时对象而不是类型名称。
c++ - 使用标准构造函数传递临时对象
我想将一个临时对象(例如 std::string)传递给我的对象的构造函数:
但我收到此错误:
如果我将任何内容传递给临时对象的构造函数(例如字符串(“”)),一切正常。为什么?