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

c++ - 转换的奇怪问题

在下面的代码中:

由于某些奇怪的原因,当我尝试运行 MakePair 时出现错误,为什么?天知道...

这是这个错误:
错误错误 C2665:Pair::Pair':3 个重载都不能转换所有参数类型

我只是不明白要执行什么转换?

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

0 投票
2 回答
456 浏览

c++ - 为什么 T&& 实例化为 int&?

谁能解释一下为什么会编译以及为什么会t以 type 结尾int&

我在 GCC 4.5.0 20100604 和 GDB 7.2-60.2 上看到了这个

0 投票
3 回答
367 浏览

c++ - 在 VS 2010 上临时接受回调

我有一个回调实现,它使用右值引用来存储与 gcc 一起工作的参数,但在某些代码上无法在 VS 2010 中编译。一个简短的版本:

使用 gcc 4.4 这会产生:

$ g++ clbck.cpp -std=c++0x -o clbck && ./clbck
函数 sample1 这里
函数 sample2 这里
函数 sample2 这里

但是,由于标记的行,当尝试实例化 registerFunc 时,它无法在 VS 2010 中编译:

错误 C2664: 'F::F(FuncType,ArgType &&)' : 无法
使用
[
FuncType=void (__cdecl *)(std::string),
ArgType将参数 2 从 'const char *' 转换为 'const char *&&' =const char *
]
你不能将左值绑定到右值引用

谷歌搜索在 VS2010 上发现了与 Boost 1.44 类似的错误,但推荐的解决方案是根本不使用右值引用。真的没有别的办法了吗?

当您这样做时,我处理这些回调的方式有问题吗?它适用于函数指针和仿函数(我还没有测试过 lambdas),我发现的唯一缺点是上面描述的那个。(请记住,这里显示的代码只是一个小演示,在实际代码中我没有给用户任何指针;我实际上是在使用它在 Qt 应用程序的不同线程中执行函数)。

0 投票
2 回答
2622 浏览

c++ - C++0x:右值引用与非常量左值

在 C++03 中编程时,我们不能将未命名的临时对象T()传递给函数void foo(T&);。通常的解决方案是给临时命名,然后像这样传递它:

现在,C++0x 出现了——现在有了右值引用,定义为的函数void foo(T&&)将允许我传递一个临时值。这让我想到了我的问题:既然一个接受右值引用的函数既可以接受右值引用(未命名的临时对象)也可以接受左值引用(命名的非常量引用),是否有任何理由在函数参数中再使用左值引用?我们不应该总是使用右值作为函数参数吗?

当然,采用左值引用的函数会阻止调用者传递临时值,但我不确定这是否是一个有用的限制。

0 投票
5 回答
1387 浏览

c++ - 添加移动构造函数和移动赋值运算符何时会真正开始有所作为?

考虑到当今编译器在返回值优化方面的高质量(RVO 和 NRVO),我想知道开始添加移动构造函数和移动赋值运算符实际上对什么类复杂度有意义。

例如,对于这个really_trivial类,我只是假设移动语义不能提供比 RVO 和 NRVO 在复制它的实例时已经提供的任何东西:

在这个semi_complex类中,我会毫不犹豫地添加一个移动构造函数和移动赋值运算符:

那么,添加移动构造函数和移动赋值运算符的成员变量的数量和种类开始变得有意义?

0 投票
4 回答
7005 浏览

c++ - 使用右值引用成员?

我想知道右值引用成员有什么用

与左值引用成员相比,它有什么优点或缺点吗?它的主要用例是什么?

0 投票
9 回答
75180 浏览

c++ - C++11 的三规则变成五规则?

因此,在观看了关于右值引用的精彩讲座后,我认为每个类都会受益于这样的“移动构造函数”、template<class T> MyClass(T&& other) 编辑,当然还有“移动赋值运算符”,template<class T> MyClass& operator=(T&& other)正如 Philipp 在他的回答中指出的那样,如果它是动态分配的成员,或通常存储指针。就像如果前面提到的要点适用,你应该有一个复制ctor、赋值运算符和析构函数。想法?

0 投票
1 回答
195 浏览

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

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

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

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

选项1

解决问题的选项 1:

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

选项 2

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

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

问题

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

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

0 投票
2 回答
735 浏览

c++ - 是否有必要从不同的类定义移动构造函数?

考虑以下:

为了充分利用移动语义,是否有必要定义像第二个这样的构造函数?还是会在适当的情况下自动处理?