3

この回答には、次のコードがあります。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <limits>

using namespace std;

struct station{
    string _stationName;
    int _studentPass;
    int _adultPass;
};

std::istream& operator>>(std::istream& is, station& rhs){
    getline(is, rhs._stationName, ';');
    is >> rhs._studentPass >> rhs._adultPass;
    return is;
}

int main(){
    istringstream foo("4;\nSpadina;76 156\nBathurst;121 291\nKeele;70 61\nBay;158 158");

    foo.ignore(numeric_limits<streamsize>::max(), '\n');

    vector<station> bar{ istream_iterator<station>(foo), istream_iterator<station>() };

    for (auto& i : bar){
        cout << i._stationName << ' ' << i._studentPass << ' ' << i._adultPass << endl;
    }

    return 0;
}

出力は次のとおりです。

スパダイナ 76 156

バサースト 121 291

キール 70 61

ベイ 158 158

私の予想される出力はスペースを2倍にしません:

スパダイナ 76 156
バサースト 121 291
キール 70 61
ベイ 158 158

次のように変更すると、期待される出力が得られますoperator>>

std::istream& operator>>(std::istream& is, station& rhs){
    if (is >> rhs._stationName >> rhs._adultPass){
        auto i = rhs._stationName.find(';');

        rhs._studentPass = stoi(rhs._stationName.substr(i + 1));
        rhs._stationName.resize(i);
    }
    return is;
}

これはコンパイラのバグか何かのように思えますが、Visual Studio 2013gcc 4.9.2 の両方でこの動作が見られるのは奇妙なことです。

誰かが私にこれを説明できますか?

4

1 に答える 1