问题标签 [temporaries]

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 投票
7 回答
4397 浏览

c++ - C ++中的所有临时右值吗?

过去几年我一直在使用 C++ 进行编码。但是有一个问题我还没有弄清楚。我想问一下,C++ 中的所有临时变量都是右值吗?

如果不是,谁能给我一个例子,其中代码中临时生成的是左值

0 投票
3 回答
1486 浏览

c++ - C++ 复制构造函数、临时对象和复制语义

对于这个程序

我得到的输出是:

由于f()是按值返回,它应该返回一个临时的。照原样,T a = x;T a(x);不会调用复制构造函数来构造a,并将临时传入作为其参数吗?

0 投票
10 回答
360 浏览

c++ - 什么时候应该使用临时变量?

具体来说,我想知道我应该写哪些:

或者:

我不需要遵循任何风格准则。优化后,我认为这两种选择都不会影响性能。通常首选的风格是什么,为什么?

编辑: items[j].subMenu 的类型是 boost::weak_ptr。lock() 从中创建一个 shared_ptr 。实际上,上述两个版本在临时 shared_ptr 持续多长时间方面存在模棱两可的差异,因此我将两个示例包装在 { 大括号 } 中以解决其中的歧义。

0 投票
5 回答
1455 浏览

c++ - 解决 C++ 对临时对象的非常量引用的限制

我有一个 C++ 数据结构,它是其他计算所需的“便签本”。它的寿命不长,并且不经常使用,因此对性能不是很重要。但是,它包括一个随机数生成器以及其他可更新的跟踪字段,虽然生成器的实际值并不重要,但重要的是更新值而不是复制和重用。 这意味着一般来说,此类的对象是通过引用传递的。

如果一个实例只需要一次,最自然的方法是在需要的地方构造它们(可能使用工厂方法或构造函数),然后将暂存器传递给使用方法。消费者的方法签名使用按引用传递,因为他们不知道这是唯一的用途,但是工厂方法和构造函数按值返回 - 您不能通过引用传递未命名的临时对象。

有没有办法避免用讨厌的临时变量阻塞代码?我想避免以下事情:

我可以在本质上制作暂存器mutable并标记所有参数const &,但这并没有让我觉得这是最佳实践,因为它具有误导性,而且对于我无法完全控制的课程,我不能这样做。通过右值引用传递将需要向所有暂存器消费者添加重载,这违背了目的 - 具有清晰简洁的代码。

考虑到性能并不重要(但代码大小和可读性是关键),传递这样一个暂存器的最佳实践方法是什么?如果需要, 可以使用 C++0x 功能,但最好仅使用 C++03 功能就足够了。

编辑: 需要明确的是,使用临时是可行的,这只是我想避免的代码中的不幸混乱。如果你从不给​​临时文件起个名字,它显然只使用过一次,而且要阅读的代码行数越少越好。此外,在构造函数的初始化程序中,不可能声明临时对象。

0 投票
4 回答
968 浏览

c++ - 我们可以检查目标文件是否存在由 C++ 编译器引入的临时文件?

有没有办法检查从下面的代码( file1.o )生成的目标文件是否存在临时引入的编译器?我们可以使用哪些工具从目标文件中获取此类信息?

0 投票
1 回答
1693 浏览

c++ - 在 c'tor 初始化器列表中将临时绑定到 const 引用

C++03 中的第 12.2.5 节说“临时绑定到构造函数的 ctor-initializer (12.6.2) 中的引用成员直到构造函数退出
所以我尝试了以下程序

我得到的输出是:

现在根据标准,由 bar 的 c'tor 的 c'tor init-list 中的 foo() 临时生成的临时文件将在 bar 的 c'tor 之后被销毁,因此foo d'tor应该在之后打印,bar c'tor
但情况相反。
请说明原因。

0 投票
2 回答
685 浏览

c++ - 如果临时对象是隐式不可修改的,这是如何工作的?

有人告诉我,在 C++03 中,临时变量是隐式不可修改的。

但是,以下在 GCC 4.3.4(在 C++03 模式下)上为我编译:

这是如何编译的?

(我不是在谈论关于绑定到引用的临时规则。)

0 投票
3 回答
958 浏览

c++ - 为什么未使用的临时对象没有 gcc/g++ 警告?

考虑以下代码:

(这是 GoF 中描述的观察者模式的实现。)这里的用户干预是为了保护 attach() 和 notify() 不同时运行,因此 boost::unique_lock。目标是保护subscribers容器。

但是确实很难注意到这些锁实际上只是临时的(仔细看看,没有为它们分配名称)。因此,当临时对象被破坏时,互斥锁上的锁将立即释放,即代码不是线程安全的。我希望在这种情况下会出现编译器警告。诸如“未使用的临时”之类的东西。

更糟糕的是,cppcheck 也不会识别这个错误。(cppcheck:ac/c++代码分析工具http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page

Gcc 对未使用的变量发出警告。这里的临时变量是一个未使用的变量,肯定是程序员疏忽的结果。那么,为什么在这种情况下没有警告呢?也许发现这种情况太复杂了?

0 投票
0 回答
81 浏览

c++ - 将临时对象绑定到引用

可能重复:
为什么非常量引用不能绑定到临时对象?

首先,我了解标准要求临时对象只能绑定到 const 引用,并且据我所知,在这种情况下,临时对象的生命周期绑定到引用的生命周期。

除了“因为标准这么说......”为什么防止临时对象绑定到一般(即非常量)引用是一个好主意?

考虑以下情况,我们有一个需要一些工作空间的例程:

foo为什么单独调用如下代码会如此邪恶:

当然我们可以这样做:

但是随后 的生命周期work会延长到封闭块的末尾,这可能是不需要的。

我知道有一些方法可以解决这种事情,但是这里的案例 1 将是一种很好的做事方式,除非我们不允许。

0 投票
2 回答
2974 浏览

c++ - BOOST_FOREACH 迭代 boost::shared_ptr

我正在做与此项目类似的事情正确的 BOOST_FOREACH 用法?

但是,我返回的列表包含在 boost::shared_ptr 中。如果我没有在 BOOST_FOREACH 循环之前将列表分配给变量,我会在运行时崩溃,因为列表正在被破坏,因为它是临时的。

然后后来..

我希望能够使用上述内容而不必引入变量“myList”。这可能吗?