我在 Ubuntu 12.04 和 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 上使用 C++ 进行编程。
我有一个模板化的 Vector 类
template <typename type, int length>
class Vector {
// Implementation
};
它有 length
类型的 type
组件。
我在其他一些类中使用了这个类,它也是模板化的。此类将用于其 vector 的元素数作为模板参数 (dim
)。
这个参数不是 2 就是 3。我必须做一些特殊的事情,如果 dim == 3
,所以我或多或少经常写这样的事情:
if (dim == 3) {
// do special things here
}
我认为,当使用参数 2 调用该类时,编译器会发现条件永远不为真且不会转换它,反之亦然,如果参数为 3,编译器会发现条件为永远不会错误,并且会翻译所有内容并优化 if
。
当使用 -O0
编译时,我没有收到任何警告,但是当打开 -O3
时,我收到警告 array subscript is above array bounds
指向像这样的行
Vector<pr, dim> v;
v[0] = ...
v[1] = ...
if (dim == 3) v[2] = ...
其中 pr
是一个类型,作为参数给出。
我不明白,为什么我会收到警告,因为:如果 dim == 2
,则永远不会执行赋值,如果为 3,则赋值不会导致任何问题。
我一直认为,模板将像这样工作:编译器获取模板代码并用给定的参数替换所有出现的参数,然后将其视为一个简单的类。
我现在的问题是,为什么编译器警告我一些事情,它知道这些事情永远不会发生?
为什么在优化编译时我只收到警告?
最佳答案
即使永远不会满足 if
条件,编译器也会编译代码,并向您发出警告。
您可以忽略警告,因为 if
会阻止它实际执行,或者专门化/SFINAE 函数/类以在参数为 3 时执行额外的操作。
或者等待大约 5 年,直到我们得到 static_if
。
关于c++ - 访问具有模板化长度的数组时出现伪造的 "array subscript is above array bounds"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104227/