Are there any cases where it is incorrect to replace push_back with emplace_back?

c++, c++03, c++11, vector

Solution

I constructed a short example that actually fails to compile when `push_back` is replaced by `emplace_back`:

#include <vector>
struct S {
    S(double) {}
  private:
    explicit S(int) {}
};
int main() {
    std::vector<S>().push_back(0); // OK
    std::vector<S>().emplace_back(0); // error!
}

The call to `push_back` needs to convert its argument `0` from type `int` to type `S`. Since this is an implicit conversion, the explicit constructor `S::S(int)` is not considered, and `S::S(double)` is called. On the other hand, `emplace_back` performs direct initialization, so both `S::S(double)` and `S::S(int)` are considered. The latter is a better match, but it's `private`, so the program is ill-formed.

Problem

Can I break a valid C++03 program by replacing `std::vector::push_back` with `emplace_back` and compiling it with C++ 11 compiler? From reading `emplace_back` reference I gather it shouldn't happen, but I'll admit I don't fully get rvalue references.

Original source