c++ - 访问具有模板化长度的数组时出现伪造的 "array subscript is above array bounds"警告

标签 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 组件。

我在其他一些类中使用了这个类,它也是模板化的。此类将用于其 vector 的元素数作为模板参数 (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

关于c++ - 访问具有模板化长度的数组时出现伪造的 "array subscript is above array bounds"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14104227/

相关文章:

c++ - 引用模板c++

c++ - 模板调用有什么区别?

c++ - 在 Windows 上使用 SSL 和预构建 Boost 构建 Mongo Cpp 驱动程序

c++ - 本地类访问问题

C++:读取文本文件中不确定数量的变量并在struct中修改,然后替换文本文件中的行

java - 在 Java 中为链中的变量赋值

javascript - 如何创建用于二维数组搜索的函数?

c++ - VS Code C++ 程序在调试时不显示任何输出

c++ - 带负值的 Unsigned long

函数模板参数的C++模板实例化