Следующий код
#include <iostream>
#include <map>
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
m.erase(i);
}
};
int main()
{
std::map<int, foo> m;
m.emplace(1, foo() );
std::cout << m.size() << std::endl;
m[1].kill(m, 1);
std::cout << m.size() << std::endl;
}
компилируется без предупреждения (g++), выполняется без ошибок и, судя по результату, метод kill
удаляет объект foo
с карты. Однако я считаю, что это может быть поведение undefined. Похоже, что в методе kill
после того, как строка m.erase(i)
this
больше не указывает на действительный объект.
Что говорит об этом стандарт С++?