我最初编写了一些std::array
在 Microsoft VS 2012 中使用的代码。但是,将其移植到 g++ 4.7.1 时,出现了一些问题。它被缩小到平台之间迭代器行为的差异。
以下是隔离差异的基本代码示例:
#include <vector>
#include <array>
#include <iostream>
const std::array<std::array<int, 3>, 3> scoring_segment_codes_ = {{
{{1, 2, 0}}, {{3, 4, 0}}, {{99, 100, 0}}
}};
int main()
{
// This works on: g++ (Debian 4.5.3-9) 4.5.3
// and Visual Studio 2012 (Windows 8)
// but NOT g++ (Debian 4.7.1-7) 4.7.1
for (auto i = scoring_segment_codes_.at(1).begin(); *i != 0; ++i)
{
std::cout << "Bad: " << *i << std::endl;
}
std::cout << std::endl;
// works on all three
for (unsigned i = 0; i < scoring_segment_codes_.at(1).size(); i++) {
std::cout << "Good: " << scoring_segment_codes_.at(1)[i] << std::endl;
}
std::cout << std::endl;
// works on all three
auto bees = scoring_segment_codes_.at(1);
for (auto i = bees.begin(); *i != 0; ++i)
{
std::cout << "Good: " << *i << std::endl;
}
return 0;
}
该样本在g++ (Debian 4.5.3-9) 4.5.3
and上的输出Microsoft VC++
为:
Bad: 3
Bad: 4
Good: 3
Good: 4
Good: 0
Good: 3
Good: 4
这就是我所期望的输出。但是,g++ (Debian 4.7.1-7) 4.7.1
产生输出:
Bad: 3
Bad: 32513
Bad: 6297664
Good: 3
Good: 4
Good: 0
Good: 3
Good: 4
不同之处似乎在于检索迭代器的方式。我曾认为结果auto i = scoring_segment_codes_.at(1).begin()
是定义的行为。不是吗?还是问题完全是其他问题?
如果这是 g++ 4.7.1 的问题,那么不幸的是,这是一个我坚持使用的系统。有什么我可以让它在 g++ 4.7.1 上工作的吗?我知道通过并确保所有迭代器的使用是兼容的是一种选择,但这似乎是一个非常丰富的错误来源。