I have a std::map and trying to fill it with pairs (name, id). The id field is simply generated from map's size(). Here's a simplified version:
#include <iostream>
#include <map>
struct A {
    std::string name;
    int id;
    A(const std::string &s) : name(s), id(-1) { }
};
class Database {
    std::map<std::string, int> ids;
public:
    void insert(A *item) {
        ids[item->name] = item->id = ids.size();
    }
    void dump() const {
        for (std::map<std::string, int>::const_iterator i = ids.begin(); i != ids.end(); i++)
            std::cout << i->second << ". " << i->first << std::endl;
    }
};
int main(int argc, char **agrv) {
    A a("Test");
    Database db;
    db.insert(&a);
    db.dump();
    return 0;
}
The problem is that different compilers treat the ids[item->name] = item->id = ids.size() part differently. Clang++ produces
item->id = ids.size(); // First item gets 0
ids[item->name] = item->id;
when g++ does something like
ids.insert(std::pair<std::string, int>(item->name, 0));
item->id = ids.size(); // First item gets 1
ids[item->name] = item->id;
So, is this code valid (from the STL perspective) or it is as evil as i = ++i + ++i?
 
     
     
    