initializer_list 和移动语义
C 中的initializer_list 类型通常用于初始化带有大括号括起来的值列表的容器。但是,与常规容器不同,initializer_list 不遵循值语义。因此,出现了一个常见的问题:
元素可以从 std::initializer_list
这个问题的答案是否定的。即使正在移动的元素属于仅移动类型,尝试这样做也会产生副本。这是因为initializer_list 的begin() 和end() 函数返回指向const 值的指针。当 std::move 应用于 const 值时,结果是一个不可变的右值引用,无法对其进行有意义的移动。相反,它将绑定到 const T& 类型的函数参数,从而产生复制语义。
考虑到initializer_list 旨在存储临时对象列表,这种行为可能看起来出乎意料。然而,据信,由编译器自行决定使类型为 const 或 mutable 将允许更有效地静态初始化列表。
更新:关于仅移动类型的initializer_list 支持的提案
为了响应反馈,已经起草了一份 ISO 提案来为初始化器列表中的仅移动类型提供支持。该提案仍在审查中,但它为当前使用仅移动类型时initializer_list 的限制提供了潜在的解决方案。
以上是元素可以移出'std::initializer_list”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!