私は元々、Microsoft VS 2012で使用するコードをいくつか作成しstd::array
ました。しかし、それを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
は次の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で動作させることができるものはありますか?すべてのイテレータの使用法に互換性があることを確認することはオプションですが、これは非常に豊富なバグの原因のようです。