问题标签 [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 投票
3 回答
4413 浏览

c++ - 数组和右值

$4.2/1 - ““N T 数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的右值。结果是指向数组第一个元素的指针。”

除了在初始化/声明期间,我不确定我们如何获得数组类型的右值?

0 投票
3 回答
3566 浏览

c++ - 右值引用是否允许悬空引用?

考虑以下。

这不会计算任何东西,但它编译时没有错误,并演示了一些我觉得令人困惑的东西:danger是一个悬空引用,不是吗?

0 投票
1 回答
97 浏览

c++ - 模板非类型参数+左值/右值

C++03 $14.1/6 - “非类型非引用模板参数不是左值。”

C++0x $14.2/6-“非类型非引用模板参数是一个右值。”

重新措辞背后有什么具体的理由吗?

0 投票
2 回答
3637 浏览

c++ - 为什么要使用 const 进行隐式转换?

在广泛阅读ISO/IEC 14882 编程语言 – C++之后,我仍然不确定为什么const需要使用单个参数构造函数将隐式转换为用户定义的类型,如下所示



从第 4 节第 3 行开始

当且仅当声明 T t=e; 时,表达式 e 可以隐式转换为类型 T;对于一些发明的临时变量 t (8.5) 是良构的。某些语言结构要求将表达式转换为布尔值。出现在这种上下文中的表达式 e 被称为在上下文中转换为 bool 并且当且仅当声明 bool t(e); 对于一些发明的临时变量 t (8.5) 是良构的。任一隐式转换的效果与执行声明和初始化然后使用临时变量作为转换的结果相同。如果 T 是左值引用类型 (8.3.2),则结果为左值,否则为右值。当且仅当初始化将表达式 e 用作左值时,表达式 e 才用作左值。

之后,我在 8.5 第 6 行中找到了与用户定义类型相关的初始化程序部分

如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型。

最后,我在 12.3 第 2 行结束了关于用户定义的转换,其中指出

用户定义的转换仅适用于明确的情况(10.2、12.3.2)。

不用说,10.2 和 12.3.2 没有回答我的问题。

  1. 有人可以阐明const对隐式转换有什么影响吗?
  2. 使用const12.3 第 2 行的转换是否“明确”?
  3. 是否会const以某种方式影响第 4 节中讨论的左值与右值?
0 投票
6 回答
853 浏览

c++ - C++ 常量引用和常量之间的区别?

有什么区别:

和(没有&符号):

它们似乎都具有相同的 L 和 R 值,那么有什么区别?

0 投票
2 回答
665 浏览

c++ - 我想我可能想出了一个数组类型右值的例子

C++03 §4.2 N°1:
“NT 数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的右值。结果是指向数组第一个元素的指针。

很长一段时间以来,这句话让我感到困惑的是,我不太明白数组类型的右值是什么意思。也就是说,我想不出一个类型是数组而结果是右值的表达式。我读了这个线程,它基本上问了同样的问题,接受的答案是“不,没有数组类型的右值”。我想我可能对此有矛盾。

C++03 §5.2.5 N°4:(关于表达式 E1.E2)
如果 E2 是非静态数据成员,并且 E1 的类型是“cq1 vq1 X”,并且 E2 的类型是“cq2 vq2 T”,表达式指定第一个表达式指定的对象的命名成员。如果 E1 是左值,则 E1.E2 是左值。

我假设否则它是一个右值(假设 E2 不是参考,这种情况由 覆盖§5.2.5 N°3),因此......

我在这里看到两个选项:
选项1:我是对的,万岁,是的,很酷。在这种情况下,问题是:还有其他例子吗?
选项2:我错了,在这种情况下,问题是:这是标准的缺陷吗?

我不知道 1,但我真的怀疑 2,因为当他们谈到函数到指针的转换时,他们只提到了函数类型的左值(很明显没有这样的右值)。因此,他们很可能已经考虑过数组类型的右值。

所以,基本上我的问题是我是否想出了一个数组类型的右值示例,如果没有,请提供一个有效的示例,我坚信存在。

0 投票
1 回答
236 浏览

c++11 - 具有元组成员的对象的移动构造函数的性能

我对移动构造函数的性能有疑问,伪 C++ 类:

当我移动Foo1类的对象时,它将初始化存储在元组中的所有对象的移动构造函数,对吗?这意味着,移动操作可能非常昂贵。

但是我移动Foo2类的对象整个移动操作要快得多,因为我只传递存储在智能指针中的数据的内部指针,对吧?

R 值引用比 L 值引用更快,因为它需要的复制操作要少得多,这很明显。然而,使用移动构造函数从函数返回对象仍然比将相同对象存储在智能指针中并返回智能指针更昂贵。

通过左值移动对象非常慢,通过智能指针移动它非常快,通过右值移动它在中间的某个地方。

我看不到 r 值的“力量”,因为它没有很多人说的那么有效。恕我直言,使用智能指针而不是 r 值更好(我的意思是更快),它的代码优雅而清晰。我对吗?

0 投票
3 回答
872 浏览

c++ - 关于左值到右值的转换

“左值到右值的转换不是在一元 & 运算符的操作数上进行的。”

我可以知道这意味着什么>任何人都可以解释一下..请

前任:

0 投票
7 回答
11363 浏览

c++ - 为什么占用临时地址是非法的?

我知道下面写的代码是非法的

原因是我们不允许获取临时对象的地址。但我的问题是为什么?

让我们考虑以下代码

这里接受的答案提到

“通常编译器将临时和副本视为两个对象,它们位于完全相同的内存位置并避免复制。”

根据该声明,可以得出结论,临时存在于某个内存位置(因此其地址可能已被占用)并且编译器决定通过在存在临时的相同位置创建就地对象来消除临时对象.

这是否与不能获取临时地址的事实相矛盾?

我还想知道如何实现返回值优化。有人可以提供与 RVO 实施相关的链接或文章吗?

0 投票
1 回答
10492 浏览

c++ - 构造函数的最佳形式?通过值或引用传递?

我想知道我的构造函数的最佳形式。这是一些示例代码:

据我了解,这是编译器在每种情况下可以做的最好的事情。

(1a) y 被复制到 x1.m_y (1 份)

(1b) y复制到X的构造函数的参数中,然后复制到x1.m_y(2份)

(1c) y 被移动到 x1.m_y (1 move)

(2a) f() 的结果被复制到 x2.m_y 中(1 份)

(2b) f()被构造成构造函数的参数,然后复制到x2.m_y(1份)

(2c) f() 在栈上创建,然后移入 x2.m_y (1 move)

现在有几个问题:

  1. 在这两个方面,通过 const 引用传递并不差,有时甚至比通过值传递更好。这似乎与“想要速度?传递价值”的讨论背道而驰。. 对于 C++(不是 C++0x),我应该坚持这些构造函数的 const 引用传递,还是应该按值传递?对于 C++0x,我应该通过右值引用而不是按值传递吗?

  2. 对于 (2),我更喜欢将临时对象直接构建到 x.m_y 中。即使是我认为的右值版本也需要移动,除非对象分配动态内存,否则它的工作量与副本一样多。有没有办法对此进行编码,以便允许编译器避免这些复制和移动?

  3. 我对我认为编译器可以做得最好的事情和我的问题本身都做了很多假设。如果它们不正确,请更正其中的任何一个。