问题标签 [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.

0 投票
1 回答
290 浏览

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

0 投票
4 回答
842 浏览

c++ - 如何允许临时的非常量复制构造函数

如何允许具有复制构造函数的类从临时对象中复制构造,该复制构造函数采用非常量引用?

背景是这样的:

我有一个函数应该返回一个指向所有从 Base 继承的对象的指针列表,所以我需要类似vector<Base*>. 鉴于这vector<auto_ptr>不是一个很好的选择,我想编写一个简单的包装器vector<Base*>来删除其析构函数中的所有元素。

我面临以下问题:

我的类有一个复制构造函数,如下所示:

这样我就可以将指针列表复制到新实例并在旧实例中清除它。

但显然,这不适用于返回值,因为临时对象不绑定到非常量引用。看到函数可以返回auto_ptr,它们是怎么实现的呢?

注意:我不能使用 C++11 或 boost,因此不能选择移动语义或 unique_ptr。

如果有帮助,这是我到目前为止的代码:

0 投票
2 回答
3025 浏览

c++ - 向量::交换和临时对象

代码如下:

上面的代码无法编译,错误:

但是,如果我将代码更改为这样的代码,它可以编译:

为什么?

0 投票
3 回答
192 浏览

c++ - 临时对象未正确销毁?

在此处查看此代码:

在这个程序中,编译器应该抱怨重复删除j. 第一次删除是在临时对象temporary(123)被销毁时完成的。第二次删除是在var对象被销毁时完成的。但这工作正常吗?

这是否意味着临时对象不调用析构函数?

0 投票
3 回答
1562 浏览

c++ - 返回值总是暂时的吗?

这个页面说了一件奇怪的事情:-

仅当您的程序不将返回值复制到对象时才会创建临时对象,并且给出的示例是

但如果我已经完成了:-

在我看来,它还将创建一个临时文件,如下所示:-

Func()构造一个本地对象。接下来,在调用者的堆栈上复制构造这个本地对象,将 atemporary object用作 obj 的复制构造函数的参数。

我错了吗?
这与复制省略有关吗?

0 投票
3 回答
1784 浏览

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意味着清除对共享对象的引用。

0 投票
4 回答
4039 浏览

c++ - 临时对象存储在哪里?

临时对象是否存储在动态(堆)内存中?

0 投票
2 回答
167 浏览

c++ - 何时将临时用作命名对象的初始化程序?

在“C++ 编程语言(第 3 版)”第 255 页中:

临时可以用作 const 引用或命名对象的初始化程序。例如:

这可以。当“它的”引用或命名对象超出范围时,临时对象被销毁。

他是说创建的临时对象在超出范围s1+s2时被销毁吗?ss复制初始化后它不会被销毁ss吗?

0 投票
2 回答
134 浏览

c++ - 杂项临时对象 T()

考虑这段代码:

我发现 的值为j1,但这应该是 0,因为int()它是一个值等于 0 的临时值。

此外,运算符的语法newnew typename,但这里T()将是一个临时对象而不是类型名称。

0 投票
2 回答
2847 浏览

c++ - 使用标准构造函数传递临时对象

我想将一个临时对象(例如 std::string)传递给我的对象的构造函数:

但我收到此错误:

如果我将任何内容传递给临时对象的构造函数(例如字符串(“”)),一切正常。为什么?