This is probably rather obvious, but I wasn't able to locate this guarantee in MIC docs. Take, struct Foo { explicit Foo(Bar* b = nullptr) : bar(b) {} Bar* bar; }; int getBarValue (const Foo& f) { assert( f.bar ); return f.bar->getValue(); } boost::multi_index< Foo, indexed_by< < hashed_unique < member<Foo, Bar* , &Foo::bar > >> , hashed_non_unique < global_fun<const Foo&, int, &getBarValue >>
FooIndex;
void grill() { FooIndex fooIndex; Bar* b; { auto bWork = make_unique<Bar>(); // ... fooIndex.emplace( bWork.get() ); b = bWork.get(); } fooIndex.erase(b); // ... } Please ignore the fact that raw-pointers are potentially dangerous etc. The question is does erase() call getBarValue() despite the fact I am using the first index? More generally, do key extractors get called *at all* except at the point of insertion? Thanks, Nick