问题标签 [rvalue]

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

c++ - 参数类型推导、引用和右值

考虑一个函数模板需要转发一个参数同时保持它的左值性以防它是一个非常量左值的情况,但它本身与参数的实际情况无关,如下所示:

x是一个右值,而不是被推T导出为一个常量类型,它给出了一个错误:

似乎forward为了处理右值(不调用显式模板参数)需要有一个forward(const T&)重载,即使它的主体将是一个完全相同的副本。

有没有办法避免这种重复?

0 投票
3 回答
307 浏览

c++ - 深返回时右值引用中断

从大于 1 的深度传递返回的右值引用时,我遇到了问题。

我认为 std::vector 正在被双重释放。我正在使用 g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

上面的代码对你有用吗?我做错了什么还是库或编译器中有错误?

如果(天堂原谅)它是编译器(gcc 中还有其他已知的 C++0x 错误),有人可以告诉我是否有一种安全的方式来升级或修补 ubuntu 上的 gcc?我以前尝试过,但陷入了一堆不受支持的包中。

非常感谢。

0 投票
2 回答
441 浏览

c++ - 什么是“将移动语义扩展到 *this”?

拜托,有人可以用简单的英语解释什么是“将移动语义扩展到 *this”吗?我指的是这个提议。所有我正在寻找的是那是什么以及我们为什么需要它。请注意,我确实了解通常的右​​值引用是什么,移动语义是基于该引用构建的。我无法掌握这样的扩展为右值引用添加了什么!

0 投票
4 回答
1252 浏览

c++ - 延长临时工的寿命

允许这样做的设计原理是什么

但不是这个

?

第二行可能出现什么问题(第一行不会出现问题)?

0 投票
2 回答
710 浏览

c++ - 具有选择了非常量引用的复制构造函数的参数类型的函数?

前段时间,当我想编写一个is_callable<F, Args...>trait 时,我对某些代码的以下行为感到困惑。重载解析不会调用通过非常量 ref 接受参数的函数,对吗?为什么它不拒绝以下因为构造函数想要一个Test&?我预计它会采取f(int)

错误信息是

你能解释一下为什么一个有效而另一个无效吗?

0 投票
3 回答
2183 浏览

c++ - 为什么预增量运算符在 C 中给出右值?

在 C++ 中,预增量运算符给出左值,因为返回的是递增的对象本身,而不是副本。但在 C 中,它给出了右值。为什么?

0 投票
1 回答
195 浏览

c++ - 在没有 RValue 隐式转换的情况下正确实现

我遇到了 RValue 不允许隐式转换的问题。我的问题是什么实现更好地“绕过”这个限制?

这是说明问题的示例代码:

可以使用 RValue 但函数需要基数且参数是派生失败的所有调用。

选项1

解决问题的选项 1:

此选项要求用户在调用函数之前将派生转换为基。这违背了一些目的,因为它要求调用者知道转换的实际基类型(也就是它是什么具体的模板实例化基类型)。

选项 2

解决问题的选项2:(修改模板和CallFunction一些)

我更喜欢选项 2,因为调用者不知道当前对 RValue 施加的限制,但我不确定是否有足够的类型检查 static_asserts 可以在有人传递错误参数时消除混淆。

问题

  1. 您认为选项 2 有什么问题吗?还是选项 1 仍然是更好的方法?

  2. 使用 SFINAE 有没有办法清理类型安全?

0 投票
5 回答
11998 浏览

c++ - 通过 std::bind 传递右值

我想将一个右值传递std::bind给一个在 C++0x 中采用右值引用的函数。我不知道该怎么做。例如:

0 投票
3 回答
1259 浏览

c++ - 通过指针转换将右值绑定到非常量引用?

我不明白以下代码如何编译/不编译:

我正在使用 g++ 4.4.4。

0 投票
2 回答
1167 浏览

c++ - 关于左值到右值的转换,什么时候需要?

我在网上看了很多,似乎很多人提到了以下规则(但我在标准中找不到),

加法运算符 +(和所有其他二元运算符)要求两个操作数都是右值,结果是右值。等等..

我检查了 C++ 标准,它明确指出(第 3.10/2 条),

每当一个泛右值出现在预期纯右值的上下文中时,该泛左值就会被转换为一个纯右值

(第 5/9 条),

每当一个泛左值表达式作为操作数的操作数出现时,该操作数需要一个纯右值,左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换是应用于将表达式转换为纯右值。

它使用操作数“期望”一个纯右值的术语。但是,当我研究加法运算符、乘法运算符等时,它只提到结果是纯右值,但没有说明操作数“预期”是什么。

二元运算符是否真的期望操作数是纯右值在以下情况下会有所不同,

如果b期望是prvalue,这里会有一个lvalue到rvalue的转换,然后会执行prvalue + prvalue,返回一个prvalue,结果prvalue赋值给一个lvalue a。

但是,如果 b 不需要是纯右值,它将是左值 + 纯右值,结果是纯右值。

我真的很想知道标准在哪里明确或隐含地提到了不同运营商的规则?我检查了所有操作符部分,并且只有少数标准明确提到操作数和结果应该是左值还是右值。对于大多数运算符,该标准仅提及结果而不提及操作数要求。

谢谢。


顺便说一句,我在标准 5.19 中发现关于常量表达式的内容可能非常“隐含”地暗示二元运算符需要对操作数进行左值到右值的转换。更详细的可以参考我之前的问题,

混合使用 constexpr 和 const?

条件表达式是一个常量表达式,除非它涉及以下之一作为潜在评估的子表达式 (3.2)。

...

— 左值到右值的转换 (4.1),除非它应用于

———— 一个整数或枚举类型的左值,它引用一个非易失性的 const 对象,前面有初始化,用常量表达式初始化

谢谢阅读。