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

c++ - 防止临时对象的传递引用

我有一个“记住”对某个对象(例如整数变量)的引用的类。我不能让它引用一个立即被破坏的值,我正在寻找一种方法来保护我的班级的用户不会意外这样做。

右值引用重载是防止传入临时值的好方法吗?

私人右值重载会吗?

有没有我没看到的陷阱?

0 投票
2 回答
573 浏览

c++ - 模板化函数和类中的 T&&

我刚刚在课堂上偶然发现了这一点T&&,功能意味着不同的东西。
在功能上:

在班上:

这是否意味着如果我们T&& t在课堂上,那么t将只有右值?
有人可以指出我在哪里可以获得有关此的更多信息吗?
这是否意味着我需要为 L 和 R 值编写两个方法重载?

答案
正如 Alf 的示例所示,t函数和类中的值可以是左值或右值。

0 投票
8 回答
266 浏览

c++ - 按值返回总是 const 吗?

此代码无法编译:

行中的编译错误(GCC 4.1.2)foo(bar())

从“C”类型的临时对象对“C&”类型的非常量引用进行无效初始化

bar()返回一个mutable对象时,它应该编译......
为什么 C++ 不允许上面的代码?


编辑:我在所有答案中总结了所有好主意的答案;-)

0 投票
1 回答
92 浏览

c++11 - 如何正确覆盖“没有对临时对象的非常量引用”

我有一堂课FooFoo有一些非常量方法。我可以在临时Foo对象上调用非常量方法;我只对方法实际返回的内容感兴趣,而不是它们对Foo对象本身的作用。

第一个问题:这本身是否必然表明该类Foo设计得不好?

第二个问题:如果我想按Foo原样继续,但我仍然希望能够Foo通过引用将调用非常量方法的函数来传递对象,那么最好的方法是什么?

这就是我得出的结论:

另一种方法就是这样做:

但是这种方法的问题是,您可能会在实际声明为 const 的对象上将 const 转换为 const,这会使我陷入未定义的行为领域。

编辑:

使用 TakeFoo 的代码示例:

0 投票
1 回答
2085 浏览

c++ - Pass by value or universal reference

I want to develop a small polymorphic class with type erasure and I wonder which version of the templatized constructor is better and should be used.

We can pass by value:

or we can use a universal reference:

(The universal reference has to be enabled if for the case that T is not the class itself and the class is not copied). Any ideas? Both version look equal to me.

0 投票
3 回答
2235 浏览

c++ - 为什么我不能将右值引用原样传递给 C++11 中的另一个函数?

我有一个代码:

Clang++ 报错:no known conversion from 'int' to 'int &&' for 1st argument

为什么将i其类型更改int为传递给时lambda()

0 投票
2 回答
61 浏览

pass-by-reference - 按值传递和参考

我有一个练习题让我在即将到来的认证考试中遇到了困难。无论如何,请提供帮助!我想我了解如何获得答案的按值传递部分,但对这个问题的按引用传递部分没有任何想法。

下面代码片段末尾的 a 和 b 的值是多少?

0 投票
2 回答
80 浏览

c++ - 模板和使用右值引用作为参数

所以我有一个std::map< std::string, boost::any >被调用OptionsMap的函数,我想创建一个接受任何类型(因此是模板)的函数并将其存储在地图中。下一个代码会起作用吗?

0 投票
1 回答
351 浏览

c++ - 将 const rvalue 绑定到 rvalue 引用

在实现 BS 树时,我注意到了一些自从我开始使用 C++11 智能指针以来我不太确定的事情,这让我想知道为什么会这样。如果我使用init-brace 对{}而不是括号,则下面的代码可以正常工作;我个人的规则是初始化每个成员(直接或通过ctor),并且由于Node::rightNode::left都是智能指针,因此nullptr它是。 问题 1:为什么括号失败而 init-brace 对成功?仅在这种情况下,两者之间是否存在语义差异?

BST中,在采用 std::initializer_list 的 ctor 中,我知道 std::initializer_list 元素只能复制,根据this。因此,如果我没记错的话,根据最近 GN13 上的 Scott Meyer 的说法,对 const 对象执行移动只会触发对象的复制ctor。

问题 2为什么编译器无法在调用BST::insert( T&& )时复制对象?

0 投票
1 回答
462 浏览

c++ - 将错误消息与命名右值引用混淆

考虑以下:

不用说,这段代码无法编译。我意识到我需要std::move()在第二个函数调用中使用,但为了便于理解,我想按原样考虑代码。

尝试编译上述内容,Clang 3.5 告诉我:

错误:没有匹配的函数调用“func”

注意:候选函数不可行:对于第一个参数 void func(my_type&&) {},没有已知的从 'my_type' 到 'my_type &&' 的转换

虽然 g++ 4.9 说了几乎相同的内容:

错误:无法将“my_type”左值绑定到“my_type&&”

注意:初始化 'void func(my_type&&)' 的参数 1

这些错误消息让我很困惑,因为虽然ref肯定是一个lvalue,但它的类型仍然是my_type&&......不是吗?

我试图准确地了解这里发生了什么,所以我想知道以下哪些(如果有的话)是正确的:

  • 由于只有 rvalues 可以绑定到 rvalue 引用,并且ref是一个左值,所以它不能绑定到arg. 来自 Clang 和 g++ 的错误消息在声称这是“无法转换”ref的(非参考)时具有误导性。my_type

  • 因为它是一个左值,ref为了重载决议的目的,它被视为非引用my_type,尽管它的实际类型是my_type&&。来自 Clang 和 g++ 的错误消息具有误导性,因为它们显示的是内部用于函数匹配的类型,而不是ref.

  • 在正文中main(),类型ref 简单my_type,尽管我明确写了my_type&&。所以编译器的错误信息是准确的,我的期望是错误的。然而,情况似乎并非如此,因为

    通过。

  • 还有一些我没有考虑过的其他魔法正在发生。

再说一遍,我知道解决方案是使用std::move()将 rref 转换回右值;我正在寻找“幕后”发生的事情的解释。