我在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] = ...
其中pr
是一种类型,作为参数给出。
我不明白,为什么我会收到警告,因为:如果dim == 2
,分配将永远不会被执行,如果是3,则分配不会导致任何问题。
我一直以为,模板化的工作原理如下:编译器获取模板代码并用给定的参数替换所有参数,然后对其进行处理,因为它是一个简单的类。
我现在的问题是,为什么编译器会警告我有关事情,它知道,它们永远不会发生?
为什么我在使用优化进行编译时只会收到警告?
答案 0 :(得分:2)
即使永远不会满足if
条件,编译器也会编译代码,并为您提供警告。
您可以忽略该警告,因为if
将阻止它实际执行,或者专门/ SFINAE函数/类在参数为3时执行额外的操作。
或等待〜5年,直到我们得到static_if
。