When copy elision is/was not guaranteed (or required) by the standard, then there is no requirement for a compiler to implement it.
That meant the standard allowed compilers to support copy elision, but did not require them to. And, in practice, a number of compiler vendors chose to not implement copy elision. For those vendors it is a matter of cost - not implementing a feature consumes less developer effort. For programmers (the people who use compilers) it was a quality of implementation concern - a higher quality compiler was more likely to implement desirable optimisations, including copy elision, than a lower quality compiler - but also be more expensive to acquire.
Over time, as higher quality compilers become more freely available (by various definitions of "free" - not all are equivalent to zero cost), gradually the standard is able to mandate more features that were previously optional. But it didn't start that way.
With copy elision being optional, some compilers would rely on accessibility of relevant copy constructors, etc, and some would not. However, the notion of code which complies with requirements of the standard, which builds with one compliant compiler but not another, is naturally undesirable in a standard. Therefore the standard mandated a need for constructors to be accessible, even while permitting an implementation to elide them.