首页 > 后端开发 > C++ > 可以从 C `initializer_list` 中移动元素吗?

可以从 C `initializer_list` 中移动元素吗?

Barbara Streisand
发布: 2024-12-18 17:14:14
原创
873 人浏览过

Can Elements Be Moved from a C   `initializer_list`?

移动语义和initializer_list

在C中,一个initializer_list;是 T 类型值的临时序列。它通常用于初始化数组和其他容器。然而,出现了一个问题:可以将元素移出initializer_list吗?

考虑以下代码片段:

#include <initializer_list>
#include <utility>

template<typename T>
void foo(std::initializer_list<T> list)
{
    for (auto it = list.begin(); it != list.end(); ++it)
    {
        bar(std::move(*it));   // Allowable?
    }
}
登录后复制

答案:

不幸的是,将元素移出initializer_list不会按预期行事。尽管预期initializer_list将保存临时数组直到它们被移动,但它仍然会产生副本。

这种偏差源于以下事实:initializer_list::begin() 和initializer_list 。 ::end() 返回 const T *。所提供代码中的 move 结果产生一个 T const & &&,它表示一个不可变的右值引用。这样的表情是无法移开的。它绑定到 T const & 类型的函数参数,因为右值绑定到 const 左值引用,导致保留复制语义。

此限制背后的原因可能是允许编译器初始化initializer_list ;静态地。然而,可以通过允许编译器将类型定义为initializer_list来改进该方法。或 constinitializer_list,从而消除了用户对 begin() 和 end() 结果的 const 或可变性质的歧义。

尽管如此,已经提出了对 C 标准的拟议扩展解决此限制并允许initializer_list支持仅移动类型。虽然它仍处于开发的早期阶段,但建议未来进一步探索和采用此功能。

以上是可以从 C `initializer_list` 中移动元素吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板