问题标签 [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.
c++ - 防止临时对象的传递引用
我有一个“记住”对某个对象(例如整数变量)的引用的类。我不能让它引用一个立即被破坏的值,我正在寻找一种方法来保护我的班级的用户不会意外这样做。
右值引用重载是防止传入临时值的好方法吗?
私人右值重载会吗?
有没有我没看到的陷阱?
c++ - 模板化函数和类中的 T&&
我刚刚在课堂上偶然发现了这一点T&&
,功能意味着不同的东西。
在功能上:
在班上:
这是否意味着如果我们T&& t
在课堂上,那么t
将只有右值?
有人可以指出我在哪里可以获得有关此的更多信息吗?
这是否意味着我需要为 L 和 R 值编写两个方法重载?
答案
正如 Alf 的示例所示,t
函数和类中的值可以是左值或右值。
c++ - 按值返回总是 const 吗?
此代码无法编译:
行中的编译错误(GCC 4.1.2)foo(bar())
:
从“C”类型的临时对象对“C&”类型的非常量引用进行无效初始化
当bar()
返回一个mutable
对象时,它应该编译......
为什么 C++ 不允许上面的代码?
编辑:我在所有答案中总结了所有好主意的答案;-)
c++11 - 如何正确覆盖“没有对临时对象的非常量引用”
我有一堂课Foo
。Foo
有一些非常量方法。我可以在临时Foo
对象上调用非常量方法;我只对方法实际返回的内容感兴趣,而不是它们对Foo
对象本身的作用。
第一个问题:这本身是否必然表明该类Foo
设计得不好?
第二个问题:如果我想按Foo
原样继续,但我仍然希望能够Foo
通过引用将调用非常量方法的函数来传递对象,那么最好的方法是什么?
这就是我得出的结论:
另一种方法就是这样做:
但是这种方法的问题是,您可能会在实际声明为 const 的对象上将 const 转换为 const,这会使我陷入未定义的行为领域。
编辑:
使用 TakeFoo 的代码示例:
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.
c++ - 为什么我不能将右值引用原样传递给 C++11 中的另一个函数?
我有一个代码:
Clang++ 报错:no known conversion from 'int' to 'int &&' for 1st argument
为什么将i
其类型更改int
为传递给时lambda()
?
pass-by-reference - 按值传递和参考
我有一个练习题让我在即将到来的认证考试中遇到了困难。无论如何,请提供帮助!我想我了解如何获得答案的按值传递部分,但对这个问题的按引用传递部分没有任何想法。
下面代码片段末尾的 a 和 b 的值是多少?
c++ - 模板和使用右值引用作为参数
所以我有一个std::map< std::string, boost::any >
被调用OptionsMap
的函数,我想创建一个接受任何类型(因此是模板)的函数并将其存储在地图中。下一个代码会起作用吗?
c++ - 将 const rvalue 绑定到 rvalue 引用
在实现 BS 树时,我注意到了一些自从我开始使用 C++11 智能指针以来我不太确定的事情,这让我想知道为什么会这样。如果我使用init-brace 对{}而不是括号,则下面的代码可以正常工作;我个人的规则是初始化每个成员(直接或通过ctor),并且由于Node::right和Node::left都是智能指针,因此nullptr它是。 问题 1:为什么括号失败而 init-brace 对成功?仅在这种情况下,两者之间是否存在语义差异?
在BST中,在采用 std::initializer_list 的 ctor 中,我知道 std::initializer_list 元素只能复制,根据this。因此,如果我没记错的话,根据最近 GN13 上的 Scott Meyer 的说法,对 const 对象执行移动只会触发对象的复制ctor。
问题 2为什么编译器无法在调用BST::insert( T&& )时复制对象?
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 转换回右值;我正在寻找“幕后”发生的事情的解释。