初始化列表和移动语义:我可以将元素移出吗?
关于初始化列表和移动语义的使用出现一个问题:是是否允许将元素移出 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中文网其他相关文章!