当访问具有模板化长度的数组时,Bogus“数组下标在数组边界上方”警告

时间:2012-12-31 17:09:56

标签: c++ arrays templates compiler-warnings compiler-optimization

我在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,则分配不会导致任何问题。

我一直以为,模板化的工作原理如下:编译器获取模板代码并用给定的参数替换所有参数,然后对其进行处理,因为它是一个简单的类。

我现在的问题是,为什么编译器会警告我有关事情,它知道,它们永远不会发生?

为什么我在使用优化进行编译时只会收到警告?

1 个答案:

答案 0 :(得分:2)

即使永远不会满足if条件,编译器也会编译代码,并为您提供警告。

您可以忽略该警告,因为if将阻止它实际执行,或者专门/ SFINAE函数/类在参数为3时执行额外的操作。

或等待〜5年,直到我们得到static_if