vec.erase(vec.end()); Legal?
vec.erase(vec.end()); Legal?
顺序容器能擦除结束吗?
在标准中,它说:
a.erase(q)
Requires: For vector and deque, T shall be
MoveAssignable.
Effects: Erases the element pointed to by q
对于顺序容器,a.erase(a.end())
是no-op还是UB尚不清楚。想法?
§23.2.3[sequence.reqmts]/p3(emphasis mine):
在表100和表101中,
X
表示序列容器类表示包含T
、[…]、q
类型元素的X
的a
值表示a
的有效可解引用常量迭代器。
表100是包含a.erase(q)
的序列容器需求表。
换句话说,a.erase(a.end())
是UB。
如果我们使用此参考页进行擦除():
迭代器位置必须有效且可取消引用。因此,end()迭代器(有效,但不可取消引用)不能用作位置的值
所以,不,这是无效的。
来自cplusplus.com:"无效的位置或范围会导致未定义的行为。"
相关文章:
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- Omnet++中的.vec和.sca输出有什么区别?
- vec[i][j] 是否转换为 *(vec + i + j)?
- 如何在编译器C++不智能的情况下实现 GLSL vec* 构造语法?
- 在Rcpp(和RcppArmadillo)中,如何检查vec是否包含复数
- c++14 - vec.begin() 和 begin(vec) 之间有什么区别吗?
- 是否可以使用 std::vector<std::any> vec;这将导致异构数据类型
- 在 opencv 上将 vec 类型转换为标量类型
- OpenCV:当将 std::vector 传递给需要 OutputArray 的函数时,vec 包含垃圾
- 为什么在使用 auto&&it=--vec.end(),是 UB 时自动推导左值引用?
- C++ 犰狳 生成给定 vec 或矩阵的索引 uvec,而不循环它
- 使用高级构造函数将阵列转换为Armadillo Vec
- 当使用 std::vector::p ush_back 插入未知数量的元素时,是否应该在每次推送时检查 std::vec
- 使用 std::vector,为什么 &vec[0] 未定义的行为,而 vec.data() 是安全的?
- 如何修复此 OpenCV 错误:断言失败((无符号)i < (无符号)cn) 在 cv::Vec<unsigned char,3>:::运算符 (), 文件
- 为什么glm :: vec表示VEC值为工会
- 使用 glm::vec< 3 时出错,双>
- 将稀疏 mat-vec-mult 的结果存储到预分配的向量中
- 如何使用 for 循环将元素添加到 vec 或 rowvec
- vec.erase(vec.end()); Legal?