我用 std::array
替换了一个旧式数组,但后来我意识到编译器(至少 MSVC)正在做较少的边界检查。考虑这段代码:
double myArray[10];
myArray[11] = 3.0;
std::array<double,10> myStdArray;
myStdArray[11] = 3.0;
对于myArray,报了一个警告:
warning C4789: buffer 'myArray' of size 80 bytes will be overrun; 8 bytes will be written starting at offset 88
对于 myStdArray
,根本没有报告任何警告。
是编译器中的“错误”还是 std::array
的实现方式不允许报告此类警告?如果是这样,是否值得使用在这里似乎不太安全的 std::array
...
最佳答案
myArray[11]
是编译器知道的语言内置功能,编译器可以发出警告。
myStdArray[11]
是 myStdArray.operator[](11)
的缩写,这是一个函数调用,其中 11
很好参数类型的范围。对此的警告需要查看 operator[]
的函数体,这通常只有在函数被内联时才会发生。
此外,供应商扩展可以使 myStdArray.operator[](11)
定义明确,例如就像在 Debug模式下中止程序一样,在这样的实现中,非常很难获得有用的编译时警告。
但是,有了这样的扩展,增加的运行时安全性可能仍然比缺少编译时警告更重要。
关于c++ - 为什么 MSVC 编译器不检测 std::array 越界访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584936/