问题标签 [pass-by-rvalue-reference]

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 回答
113 浏览

c++ - 从函数返回右值引用

CPP 核心指南 F45 指出:

不要返回 T&&。

我想创建一些类,并通过一系列修改类的函数传递类。然后我将评估该类的一些成员,或者将该类存储在某个容器中,例如std::vector.

我试图以这样一种方式做到这一点,即该类只构造一次,然后被销毁或移动,并且移动的副本被销毁,然后存储的副本被销毁(当我存储它的容器被销毁时) .

本质上,我想这样做:

应该可以构造foo恰好一次,并foo通过任意数量的修改函数移动构造,然后销毁foo恰好一次。

如果将 存储foo在 a 中vector,则必须进行额外的复制/移动和销毁。

我可以实现这种行为,但是如果不将此签名用于修改功能,我想不出任何方法:

这是似乎可以满足我要求的测试代码:

现在一个函数将接受foo&&、修改foo、返回foo&&

现在使用类和修改功能:

这将完全符合我的要求。它将调用一次构造函数,正确地打印3,并调用一次析构函数。

如果我做同样的事情,除了添加这个:

它将添加一个移动构造,并在vector超出范围时破坏另一个。

这正是我想要的行为,而且我还没有想出任何其他方法可以在不foo&&从修饰符返回的情况下到达那里,并使用auto&&我的中间变量,并使用std::move()传递给后续调用的参数modify

这种模式对我非常有用。困扰我的是,我无法使用 CPP 核心指南 F.45 解决这个问题。该指南确实说:

当对临时对象的引用“向下”传递给被调用者时,返回右值引用就可以了;那么临时保证比函数调用更长寿......

也许这就是我正在做的?

我的问题:

  1. 我正在做的事情有什么根本错误或未定义的吗?

  2. 当我这样做auto&&并将鼠标悬停在 上时foo1,它将显示为foo&&. 我仍然必须将 with 包装foo1起来std::move(foo1)才能让 modify 函数将其接受为foo&&. 我觉得这有点奇怪。需要这种语法的原因是什么?

0 投票
0 回答
64 浏览

c++ - 按值、左值引用和右值引用传递函数名会发生什么?

我不确定在各种情况下右值和左值的确切机制。让我举个例子。

我的问题

  1. 函数名 f 和 f(=> &f) 之前的 & 都只是函数指针。我对么 ?
  2. 当我将函数名称或带有函数名称的 & 传递给 (1)、(2)、(3)、(4)、(5)、(6) 等各种函数的参数时会发生什么?
  3. (4) 有编译错误。f 和 &f 在我的理解下是相同的,但为什么会这样?我知道如果我使用诸如“void g1(const T& a)”之类的 const 可以编译它,但我不知道为什么。

错误信息是:

0 投票
0 回答
13 浏览

javascript - 使用嵌套的 for 循环更改数组内的对象键

我面临 JS 对象操作的问题。我想我知道问题出在哪里,但我找不到解决方案。我正在尝试通过迭代数组中的所有键来将对象内的键从骆驼案例更改为蛇案例(API 需要蛇案例)。但是当我更改它时,它会复制它并且不会影响真实对象(循环外的console.log)。我希望很清楚,这里是代码:

0 投票
0 回答
148 浏览

c++ - 为什么 C++ 在函数调用时优先使用右值引用而不是 const 引用?

所以我用 C++ 11 写了一段代码

代码的输出令人着迷,它是“rval referencence”但是如果我重写代码只是删除一个函数定义:

我得到输出为“const ref”

编辑:如果我再次将代码重写为

仍然是打印“rval ref”,请解释逻辑

有人可以解释为什么 C++ 在传递 ravlue 作为参数时优先使用 && 而不是 const 吗?## Heading ##

0 投票
1 回答
134 浏览

c++ - (c ++ 23隐式移动)将移动的本地存储变量作为右值引用返回,只有括号?

关于提案“更简单的隐式移动”(P2266R1),我不确定我是否正确理解了这个新的“符合移动条件”的东西。

如果不正确,请更正以下几点:
[ LIVE ]

  1. std::forward对于完美转发收到的右值 ref 变为可选

变成

  1. std::move成为本地创建的右值引用的可选

变成

  1. std::moveoptionaly 变成parenthesis only为本地创建的东西返回一个右值引用。

变成

注意: (3) : clang trunk 在我发布此内容时警告返回本地堆栈地址。


2021-08-02 更新

https://github.com/cplusplus/papers/issues/968#issuecomment-915353127

https://isocpp.org/files/papers/P1018R13.html#P2266r1

投票结果:✅共识。但是,反对票来自实施者,并带来了相关的新信息。这个话题需要重新讨论,并且可能无法通过全体投票。

0 投票
2 回答
109 浏览

c++ - 值传递和 std::move 与转发引用

我经常遇到传值和移动习语:

但在我看来,通过 const 引用或 rvalue 引用在某些情况下可以保存副本。就像是:

或者也许使用转发引用来避免编写两个构造函数。就像是:

是这样吗?如果是这样,为什么不使用它呢?

此外,看起来 C++20 允许使用自动参数来简化语法。我不确定在这种情况下的语法是什么。考虑:

编辑:

建议的问题是信息丰富的,但他们没有提到“汽车”案例。

0 投票
1 回答
27 浏览

c++ - 如何让模板化函数要求其参数通过右值引用传递?

由于转发引用和右值引用的语法令人困惑,我不清楚如何编写一个T通过右值引用获取某种类型的函数。也就是说,虽然

按价值取值x

通过参考,和

通过指针,当我们说

突然它x通过转发引用而不是右值引用来获取。转发引用的正确说法foo是什么?x像这样?