(A less detailed test is here .)
The two forms of initialization are actually not completely equivalent.
The first is your standard swamp design:
T o(10);
The latter, however, is more complicated.
T o = 10;
Here the expression in RHS ( 10 ) is converted to type T , then the object o copied from this converted expression. A copy construct is not possible here because your T(T&) forbids the synthesis of an implicit T(T const&) , and the temporary RHS object cannot be bound to ref-to-non const .
Now the compiler is allowed to exclude this copy-construct, and this usually happens, but the conversion must remain valid or the program is poorly formed.
[n3290: 8.5/13]: The initialization form (using parentheses or =) is usually negligible, but it matters when the initializer or the object being initialized has the class type; See below. [..]
[n3290: 8.5/14]: Initialization that occurs in the form
T x = a;
and also when passing arguments, returning a function, throwing an exception (15.1), handling the exception (15.3) and the aggregate member initialization (8.5.1) is called copy-initialization. [Note: Copy-initialization may cause a move (12.8). -end note]
[n3290: 8.5/16]: semantics of initializers is as follows. [..] If the destination type is a (possibly cv-qualified) class of type: [..] Otherwise (that is, for the rest of the copy initialization cases ), custom conversion sequences that can convert from source type to destination type or (when the conversion function is used), its derived class is listed as described in 13.3.1.4 , and the best one is selected using overload resolution (13.3). If the conversion cannot be performed or is ambiguous, the initialization is poorly formed. [..]
[n3290: 12.8/31]: When certain criteria are met, an implementation is allowed to omit the instance construct / move of the class object, even if the copy / move constructor and / or destructor for the object have side effects. [..] This permission of copy / move operations, called a copy, is permitted in the following circumstances (which may be used to eliminate multiple copies): [..]
- when a temporary class object that is not attached to a link (12.2) is copied / transferred to a class object with the same cv-unqualified type, the copy / move operation can be omitted from building the temporary object directly to the target, copy / move is skipped. [..]
(I cannot find a quote that explicitly states that the copy constructor should be available even when the copy is complete, but it is.)