Я программирую с 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, назначение не вызывает никаких проблем.
Я все время думал, что шаблонирование будет работать так: компилятор берет код шаблона и заменяет все вхождения параметров на заданные параметры, а затем обрабатывает это, как простой класс.
Теперь мой вопрос: почему компилятор предупреждает меня о вещах, он знает, что они никогда не произойдут?
И почему я получаю только предупреждения при компиляции с оптимизацией?
Компилятор компилирует код, даже когда if
условие никогда не будет выполнено, и дает вам предупреждение.
Вы можете игнорировать предупреждение, потому что if
предотвратит его выполнение или специализирует / SFINAE функцию / класс для выполнения дополнительных действий, когда параметр равен 3.
Или подождите ~ 5 лет, пока мы не получим static_if
,
Других решений пока нет …