Case 2 comes under 12.8/31 in N3225:
A program is ill-formed if the
copy/move constructor or the copy/move
assignment operator for an object is
implicitly odr-used and the special
member function is not accessible.
Just because the copy ctor is elided doesn't mean it isn't odr-used. 3.2/2:
A member of a set of candidate
functions is odr-used if it is
selected by overload resolution when
referred to from a
potentially-evaluated expression.
[Note: this covers calls to named
functions (5.2.2), oper- ator
overloading (Clause 13), user-defined
conversions (12.3.2), allocation
function for placement new (5.3.4), as
well as non-default initialization
(8.5). A copy constructor or move
constructor is odr-used even if the
call is actually elided by the
implementation. —end note ]
Beware of course that MSVC is not fully C++0x-compliant, because (a) C++0x isn't a standard yet, and isn't finalized; and (b) MSVC hasn't implemented everything up to date anyway. But this stuff isn't substantially changed from C++03, so I'm fairly confident the explanation still holds.
Case 1 would come under this too, except that on the two C++03 compilers I've checked it doesn't get that far because there's no possible conversion from a string literal to T. I can't be bothered to check whether there are any additional conversion sequences allowed in C++0x, there could be a new clause anywhere :-)
It's still a mystery to me why MSVC allows case 1 ever, even with a public copy ctor. Does it allow it in strict C++03 mode?
Case:1
you are not actually creating a temporary object of typeT
. How could you assign ita
which is of typeT
? – Verso