Bre*_*ier 5 c++ temporary lifetime rvalue-reference c++11
编辑:我认为我所问的最有可能的用例是创建一个从 接收右值引用元组的函数时std::forward_as_tuple()。
想到这个问题的原因是因为我正在检查传递给构造函数初始值设定项的对象的成员,看看它们是否是右值引用(我愿意接受建议,告诉我这是错误的错误错误......希望后面跟着一个根据经验,避免将来出现这种情况,但这就是引发问题的原因)。我想到,在稍微不同的上下文中,我可能最终会将具有右值引用成员的对象传递给我可能控制或可能不控制的多个函数(或函数对象),这些函数可能会从这些成员进行移动。
template<typename... Args>
void my_func(std::tuple<Args...>&& tup) {
//if tup's members are rvalue references,
//and this function moves guts from tup members, then...
func_i_dont_control(tup);
//what happens here if moves are done on the same members?
another_func_i_dont_control(std::move(tup));
}
Run Code Online (Sandbox Code Playgroud)
我看过使用右值引用成员?,以及右值引用成员的一些其他讨论,但我不太能够明确地解决这个问题。
我不只是问会发生什么,而是问这种情况是否应该/可能发生,以及在传递包含右值引用成员的对象时要记住哪些关键规则。
在此代码中func_i_dont_control无法悄悄窃取参数。只有右值绑定到右值引用,并且命名变量不是右值。您的代码要么无法编译,要么func_i_dont_control(具有重载)不使用移动语义。
为了有func_i_dont_control机会窃取元组(将元组绑定到右值引用),必须使用 显式地将其转换为右值std::move(tup)。
(采用左值引用的函数不应该从中移动,否则我们真的无法知道会发生什么。)
编辑但问题似乎不在于元组本身,而在于其成员。同样,这些成员不会是右值,因此func_i_dont_control需要显式移动它们。我不认为它有这样做的“道德权利”*,除非它接收整个元组作为右值,而这在您的函数中不会发生。
* 对于移动语义,您必须遵循某些准则。基本上,您可以将任何内容转换为右值并从中移动,无论您处理的是左值还是右值引用都没关系。只要遵循这些准则,移动语义就能正常工作。如果您开始将事物转换为右值而忽略这些准则,则对象将在函数调用等之后开始消失。
| 归档时间: |
|
| 查看次数: |
1144 次 |
| 最近记录: |