gpt4 book ai didi

c++ - initializer_list 和 move 语义

转载 作者:行者123 更新时间:2023-12-02 10:32:28 26 4
gpt4 key购买 nike

我是否可以将元素移出 std::initializer_list<T> ?

#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::intializer_list<T>需要特别的编译器注意,并且没有像 C++ 标准库的普通容器那样的值语义,我宁愿安全而不是抱歉和问。

最佳答案

不,这不会按预期工作;你仍然会得到拷贝。我对此感到非常惊讶,因为我认为 initializer_list存在以保留一组临时对象,直到它们成为 move 'd。
beginend对于 initializer_list返回 const T * ,所以 move 的结果在您的代码中是 T const && — 一个不可变的右值引用。这样的表达不能有意义地移开。它将绑定(bind)到 T const & 类型的函数参数因为右值确实绑定(bind)到 const 左值引用,你仍然会看到复制语义。

原因可能是编译器可以选择使 initializer_list静态初始化的常量,但将其类型设为 initializer_list 似乎更简洁或 const initializer_list由编译器自行决定,因此用户不知道是否期待 const或来自 begin 的可变结果和 end .但这只是我的直觉,可能有一个很好的理由我错了。

更新:我写过an ISO proposal对于 initializer_list只支持 move 类型。这只是初稿,还没有在任何地方实现,但您可以查看它以对问题进行更多分析。

关于c++ - initializer_list 和 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61754094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com