So is it necessary to have a copy constructor accessible when binding a temporary to a reference?
Post C++11 - No
Pre C++11 - Yes.
This code compiles fine with GCC 4.7.2 because it is compliant with the C++11 standard.
C++11 standard mandates that when a const reference is initialized from prvalue
, it must be bound directly to the reference object and no temporary is permitted to be created. Also, the copy constructor is not used or required.
Prior to C++11 the rules were different. And this behavior(whether copy constructor will be called) is implementation defined. C++03 allowed the copy constructor being called while binding a const reference to an temporary and hence post C++11 the copy constructor needs to be accessible. Visual C++2010 adheres to the C++03 standard.