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

我可以从 `std::initializer_list` 中移动元素吗?

Linda Hamilton
发布: 2024-12-26 17:02:13
原创
721 人浏览过

Can I Move Elements from a `std::initializer_list`?

我可以从 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));   // Safe?
    }
}
登录后复制

与预期相反,尝试将元素移出 std::initializer_list 会导致副本。出现这种情况是由于 std::intializer_list 的独特性质,它需要特殊的编译器处理,并且缺乏典型容器的值语义。

问题在于 std::intializer_list 的 begin() 和 end() 的返回类型::initializer_list,即 const T 。因此,表达式 'std::move(it)' 生成一个不可变的右值引用 (T const &&&),无法有效地从中移动。它仅绑定到 T const & 类型的函数参数,因为右值绑定到 const 左值引用,从而导致复制语义。

这种行为可能看起来违反直觉,但它允许编译器潜在地使初始化器列表静态化 -初始化常量。尽管如此,它还是引入了不一致的情况,用户不确定 begin() 和 end() 的结果是 const 还是 mutable。

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

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