gpt4 book ai didi

c++ - 初始化列表和 move 语义

转载 作者:行者123 更新时间:2023-12-02 09:03:14 24 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++ - 初始化列表和 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59249020/

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