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

可以将元素移出 std::initializer_list 吗?

Patricia Arquette
发布: 2024-12-26 00:49:09
原创
960 人浏览过

Can You Move Elements Out of a std::initializer_list?

初始化列表和移动语义:我可以将元素移出吗?

关于初始化列表和移动语义的使用出现一个问题:是是否允许将元素移出 std::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));   // kosher?
    }
}
登录后复制

在这里,我们想检查是否可以将元素移出 std::initializer_list。

答案

令人惊讶的是,答案是否定的。表达式 std::move(*it) 不会导致移动。相反,它生成 T const && 类型的不可变右值引用。这是因为initializer_list的begin和end方法返回const T *,这不允许移动语义。

这样做的可能原因是使编译器能够将initializer_list创建为静态初始化常量。然而,让begin和end返回initializer_list或constinitializer_list会更直观,具体取决于编译器的判断。

进一步的考虑因素

ISO提案已经为仅移动类型提供initializer_list支持。该提案虽然仍处于早期阶段,但解决了此处提出的问题。

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

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