gpt4 book ai didi

c++ - 这是 `` const_cast`` 的有效用法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:45 25 4
gpt4 key购买 nike

C++11 标准更改了 erase() 的签名标准容器的方法:他们现在接受 const_iterator s 而不是 iterator秒。本文档解释了基本原理:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf

现在,如果一个人执行std::vector<T>直接用const T *就可以了和 T *分别作为常量和可变迭代器类型。所以在 erase()方法我们可能有这样的代码:

iterator erase(const_iterator it)
{
...
for (; it != end() - 1; ++it) {
// Destroy the current element.
it->~T();
// Move-init the current iterator content with the next element.
::new (static_cast<void *>(it)) T(std::move(*(it + 1))); // FAIL
}
...
}

现在的问题是,自it是一个 const 指针,静态转换将失败。

在这种情况下,放弃 it 的常量性是否合法? ?注意 it从不指向 const对象(存储在 vector 中的对象永远不会是 const ),并且调用方法( erase() )不是 const

编辑:感谢所有回复。我想在这里回应下面的一些评论。

此代码来自一个自定义 vector 类(具有与 std::vector 类似的接口(interface)),它在不受限制的 union 之上实现了小缓冲区优化。迭代器是裸指针,因为当 vector 使用静态存储和使用动态存储时它们都需要是相同的类型,这似乎是实现这种结果的最自然的方式。

投向void *在与单元化存储交互时,这只是代码库中的习惯和一致性问题。

最佳答案

由于 erase 是非常量,是的,您可以安全地丢弃元素上的 const。但是,请注意,这不是必需的,因为可以从 const 迭代器获得非 const 迭代器:

iterator non_const = begin() + (it - begin());

这可用于迭代 vector 。

关于c++ - 这是 `` const_cast`` 的有效用法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770944/

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