Um... On the one hand, `std::string::replace`'s return value is not
vacant. It returns a reference to `*this`. So, it is natural to assume
that the opportunity to return an iterator wasn't simply ignored, but it
simply lost the debate against the idea to return `*this`. The latter
allows one to make chained call to `replace`, which was probably
considered more valuable.
On the other hand, there are several such "asymmetries" in the design of
standard containers. The same applies to various `push_back/push_front`
methods. In their case the return value is `void`, i.e. the opportunity
to return an iterator (or a reference?) was there all the time without
any other contenders. `emplace_back/emplace_front` took that
opportunity, except that they return references, not iterators.
--
Best regards,
Andrey.