0

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

我一直认为,模板会像这样工作:编译器获取模板代码并将所有出现的参数替换为给定的参数,然后将其视为一个简单的类。

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

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

4

1 回答 1

2

即使if条件永远不会满足,编译器也会编译代码,并向您发出警告。

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

或者等待大约 5 年,直到我们得到static_if.

于 2012-12-31T17:23:13.297 回答