【发布时间】:2012-08-27 04:52:06
【问题描述】:
使用以下代码使用 mingw (gcc 4.7.0) 检查成员 std::array 时遇到奇怪的行为界限
#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 启用的各个标志,但无法进一步缩小范围。使函数非常量也解决了这个问题。这可能是一个错误还是我错过了什么?
*编辑
缩小范围,看起来像是.at() 的const 版本中的一个错误
#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';
}
在 Windows Xp sp3 和 Windows 7 sp1 上使用 mingw 4.7.0 使用 -std=c++11 -O 编译的相同输出。
*编辑 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';
}
【问题讨论】:
-
在我看来这绝对是个错误。
-
它为我生成a different output...
-
g++ 4.8.0(实验性),所有代码仅适用于 -O0。与其他 -O 标志一起给出这样的警告:“
is used uninitialized in this function [-Wuninitialized]” -
我无法在 ubuntu linux 上使用 gcc 4.7 或 4.8 快照重现。