【发布时间】:2021-08-03 18:27:02
【问题描述】:
我想在编译时对 std::array 执行范围检查。这是一个例子:
#include <iostream>
#include <array>
void rarelyUsedFunction(const std::array<double, 2>& input)
{
std::cout << input[5] << std::endl;
}
int main()
{
std::array<double, 2> testArray;
rarelyUsedFunction(testArray);
}
如果我使用 g++ 编译它,则不会出现警告或错误,尽管未定义对不在数组中的元素的访问。编译后的程序只是打印一些随机值。
g++ 中是否有一个编译器选项可以在编译时执行合适的范围/边界检查?我知道我可以添加“-D_GLIBCXX_DEBUG”,但这只会在运行时执行检查。如果我有一个不经常调用的函数,则不会触发。
我知道,不能在所有情况下都执行这样的范围检查,但在上述情况下,编译器应该能够发现问题!?
【问题讨论】:
-
我相信这是
std::get被数组重载的目的 -
原则上编译器可以发现问题,但是考虑到
std::array和其他人一样只是一个自定义类型,而你传递的参数一般不是编译时常量 -
对此的编译器警告我认为只是时间问题。
-
@user4581301 编译器警告在这里可能并不总是足够好,因为它依赖于编译器推断该值在编译时是可确定的。当然对于文字来说这是微不足道的,但情况并非总是如此,并且不会以任何方式指示未标记为
constexpr的索引。编译时检查可以静默地从程序中删除,因此显式请求编译时边界检查的方法仍然有用。 -
问题是“这样做值得吗?”迟早有人会写支票,这是不可避免的,因为人们就是“那样”。检查是否进入编译器取决于它对编译器的速度和复杂性的影响。