我正在使用以下代码检查成员 std::array 与 mingw (gcc 4.7.0) 的奇怪行为界限
#include <iostream>
#include <array>
class testClass
{
std::array<int, 2> testArray;
public:
testClass();
void func() const;
};
testClass::testClass() : testArray({{1, 2}})
{
}
void testClass::func() const
{
for (int i = 0; i < 2; ++i)
std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';
}
int main()
{
testClass test;
test.func();
}
输出是
0
1
0
2
该错误似乎与优化有关,因为它仅在使用 编译时才会出现-O
,我尝试了启用的各个标志,-O
但无法进一步缩小范围。使函数非常量也解决了这个问题。这可能是一个错误还是我错过了什么?
*编辑
缩小范围,看起来像是const
版本中的错误.at()
#include <iostream>
#include <array>
int main()
{
std::array<int, 2> const testArray = {1, 2};
for (int i = 0; i < 2; ++i)
std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';
}
-std=c++11 -O
在 Windows Xp sp3 和 Windows 7 sp1 上使用 mingw 4.7.0编译的输出与上面相同。
*编辑 2
再次输出相同的
#include <iostream>
#include <array>
int main()
{
typedef std::array<int, 2> Tarray;
Tarray test = {1, 2};
for (int i = 0; i < 2; ++i)
std::cout << const_cast<Tarray const*>(&test)->at(i) << '\n' << test.at(i) << '\n';
}