Lei*_*gyu 5 c++ templates reference rvalue stdmove
在MSVC STL中,实现std::apply如下:
template <class _Callable, _Tuple_like _Tuple, size_t... _Indices>
constexpr decltype(auto) _Apply_impl(_Callable&& _Obj, _Tuple&& _Tpl, index_sequence<_Indices...>) noexcept(/* [...] */) {
return _STD invoke(_STD forward<_Callable>(_Obj), _STD get<_Indices>(_STD forward<_Tuple>(_Tpl))...);
}
Run Code Online (Sandbox Code Playgroud)
在表达式 中_STD get<_Indices>(_STD forward<_Tuple>(_Tpl))...,std::get被调用的次数与元组的长度相同。但是,每次调用 时std::get,都会有一个相应的调用std::forward.当转发右值时,std::forward相当于,意味着对该对象的std::move多次调用。这似乎可能是无效的。有人可以帮助解释我的担忧吗?std::move_Tpl
我尝试搜索各种资源,但找不到我正在寻找的答案。从定义开始也没有说服我。
意味着对 _Tpl 对象多次调用 std::move。这似乎可能是无效的。
std::move是的,对元组有多个调用。但这本身并不是无效的。
通常,将对象传递std::move给函数是对该函数的承诺,即调用者在调用后不会依赖该对象的状态。因此,第二std::move个函数通常具有不正确的语义,因为它将向第二个函数传递未指定的状态。
但在某些情况下,函数会向调用者做出更强的承诺。例如std::unique_ptr,承诺在调用其移动构造函数或移动赋值后,传递的对象将处于空状态。所以它仍然可以用作std::move.
Forstd::get更准确地知道它将做什么:除了返回对元组中所请求元素的引用之外,它不会执行任何操作。根据元组是作为右值还是左值传递,在与元素的类型组合时,它还会根据需要返回左值或右值引用。
因此,std::get实际上不会修改元组的状态,并且包扩展(顺便说一句,这不是折叠表达式。)将产生一个对元组每个元素的一个引用的列表,可能作为左值或右值,但永远不会是两个右值到同一个对象。因此,当将引用传递给被调用函数时,不存在与通用双精度std::move数相同的问题。
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |