【发布时间】:2023-04-03 04:42:01
【问题描述】:
在积极开发使用std::vector 的类期间,经常会发生索引越界的情况。 (有关实际示例,请参见 this code review question。)使用 operator[] 时,这会导致未定义的行为。尽管如此,[] 语法比写.at() 更容易阅读。
因此,我想使用[] 运算符编写我的代码,但同时启用边界检查。测试完代码后,应该很容易去掉边界检查。
我正在考虑以下代码:
util::bound_checked<std::vector<int>> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
std::cout << numbers[17] << "\n";
对我来说,这个实用程序模板似乎非常简单,以至于我希望它存在。可以?如果有,以哪个名字命名?
【问题讨论】:
-
一些编译器喜欢将
at()作为operator[]的默认实现并启用_DEUG。 -
哪个编译器?
-
您的设计有问题,而不是边界检查。向量知道它的大小,幻数是邪恶的。
-
operator[]和at具有不同的语义。选择不是方便或冗长。at引发异常,如果其他代码在catch块中处理它们,则异常很有用。除了终止当前进程之外,您将如何在如此低的抽象级别上“处理”越界错误?其实at应该被认为是std::vector的设计错误。永远不要使用它。第二件事是:为什么要删除生产中的边界检查?请运送你测试过的东西。
标签: c++ stdvector undefined-behavior