Imagine that we have two static libraries built with different implementations of
std::vector. Both of these binaries would have the code for both
pop_back (since vector is usually header only). What would the linker do when we tried to use both of these libraries in a project. Would it give an error? Could the linker remove one implementation of each of these methods so that following is possible:
push_back call from the second library calls
push_back implementation from the first library
pop_back call from the first library calls
pop_back implementation from the second library
Would it give an error? Depends on how you define "error".
It probably would not give you an error at link-time. But it would certainly corrupt your executable. The linker assumes, when it encounters multiple definitions of a symbol, that they are identical, and so all but one of them can be discarded. If they're not identical, you're violating the One-Definition Rule, which means you're heading into Undefined Behavior-land. Anything might happen. Most likely, you'll see random crashes.