首页 > 后端开发 > C++ > 元素可以移出'std::initializer_list”吗?

元素可以移出'std::initializer_list”吗?

DDD
发布: 2024-12-20 14:10:14
原创
478 人浏览过

Can Elements Be Moved Out of a `std::initializer_list`?

initializer_list 和移动语义

C 中的initializer_list 类型通常用于初始化带有大括号括起来的值列表的容器。但是,与常规容器不同,initializer_list 不遵循值语义。因此,出现了一个常见的问题:

元素可以从 std::initializer_list 中移出吗?

这个问题的答案是否定的。即使正在移动的元素属于仅移动类型,尝试这样做也会产生副本。这是因为initializer_list 的begin() 和end() 函数返回指向const 值的指针。当 std::move 应用于 const 值时,结果是一个不可变的右值引用,无法对其进行有意义的移动。相反,它将绑定到 const T& 类型的函数参数,从而产生复制语义。

考虑到initializer_list 旨在存储临时对象列表,这种行为可能看起来出乎意料。然而,据信,由编译器自行决定使类型为 const 或 mutable 将允许更有效地静态初始化列表。

更新:关于仅移动类型的initializer_list 支持的提案

为了响应反馈,已经起草了一份 ISO 提案来为初始化器列表中的仅移动类型提供支持。该提案仍在审查中,但它为当前使用仅移动类型时initializer_list 的限制提供了潜在的解决方案。

以上是元素可以移出'std::initializer_list”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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