Поддельный «индекс массива находится выше границ массива» предупреждение при доступе к массиву с шаблонной длиной

Я программирую с C ++ на Ubuntu 12.04 и g ++ (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3.

У меня есть шаблон 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

Решение

Компилятор компилирует код, даже когда if условие никогда не будет выполнено, и дает вам предупреждение.

Вы можете игнорировать предупреждение, потому что if предотвратит его выполнение или специализирует / SFINAE функцию / класс для выполнения дополнительных действий, когда параметр равен 3.

Или подождите ~ 5 лет, пока мы не получим static_if,

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector