我在 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
。
我在其他一些类中使用这个类,它也是模板化的。此类将用于其向量的元素数量作为模板参数 ( 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] = ...
wherepr
是一个类型,作为参数给出。
我不明白,为什么我会收到警告,因为:如果是dim == 2
,则永远不会执行分配,如果是 3,则分配不会引起任何问题。
我一直认为,模板会像这样工作:编译器获取模板代码并将所有出现的参数替换为给定的参数,然后将其视为一个简单的类。
我现在的问题是,为什么编译器会警告我一些事情,它知道它们永远不会发生?
为什么在使用优化编译时我只会收到警告?