我可以从 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中文网其他相关文章!