O
pair с той лишь разницей, что в случае сpair<bool, iterator> foo();ты увидишь сомнительные
auto x = foo();
x.<ctrl+space>
first и second, ничего не говорящие о сути содержимого pair
А с
auto foo() {
struct {
bool is_inserted;
iterator equal_or_inserted;
} x;
/* ... */
return x;
}
auto x = foo();
x.<ctrl+space>
Ты увидишь более самодокументированные (если очень повезёт, конечно) is_inserted и equal_or_inserted
