修改 std::D efined 行为的元素?
Modification of elements of std::Defined behavior?
给定以下代码:
#include <set>
struct X {
int a, b;
friend bool operator<(X const& lhs, X const& rhs) {
return lhs.a < rhs.a;
}
};
int main() {
std::set<X> xs;
// some insertion...
auto it = xs.find({0, 0}); // assume it != xs.end()
const_cast<X&>(*it).b = 4; // (1)
}
(1)
定义的行为吗? 即,我是否可以const_cast
对从std::set
const_iterator
获得的元素的引用,并在修改不改变排序的情况下对其进行修改?
我在这里和那里阅读了一些提出这种const_cast
的帖子,但我想知道这是否真的是定义的行为。
这是否定义了行为尚不清楚,但我相信确实如此。
在std::set
描述中似乎没有具体禁止修改值,除了您已经暗示的限制,即比较器在传递相同的输入时必须返回相同的结果([associaciative.reqmts]p3)。
但是,修改定义为const
的对象的一般规则确实适用。set
是否将其元素定义为const
没有详细说明。如果是这样,则不允许修改元素 ([dcl.type.cv]p4)。
但是[container.requirements.general]p3写道:
对于受此子句影响的声明
allocator_type
的组件,存储在这些组件中的对象应使用allocator_traits<allocator_type>::construct
函数和 使用allocator_traits<allocator_type>::destroy
函数 (20.7.8.2) 销毁。
std::set<T>
声明一个allocator_type
,默认为std::allocator<T>
。std::allocator_traits<allocator_type>::construct
传递它一个T *
,导致构造一个T
,而不是一个const T
。
我相信这意味着std::set<T>
不允许将其元素定义为const
,并且由于没有任何其他禁止,这意味着允许通过const_cast
修改元素。
就个人而言,如果我找不到更好的选择,我会考虑通过将整个事情放在一个包装结构中来避免这个问题,该结构定义了成员mutable X x;
。这将允许在没有const_cast
的情况下进行修改,只要你注意避免改变集合中已有元素的相对顺序。此外,它还将作为代码的其他读者的文档,说明您的集合的元素可以并且将被修改。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 修改 std::D efined 行为的元素?