Another constructor is called when you do T t3(3); -- but this is not a default or copy construct.
The first copy constructor is called when you pass t3 as a parameter to the g() function. Since you are passing by value, you are actually passing a copy of the object.
The second copy constructor is called when you return t from the g() function.
The assignment operator call is obvious.
Note that in an optimized build, it's very likely that both copy constructors can be optimized away resulting in 0 copy ctor calls. But it depends on the circumstances.