Ответ 1
Трудно было найти, но, честно говоря, это меня исказило. Это называется разрешением конструктора экземпляра.
Стандарт иллюстрирует этот пример:
class X{
public:
X(int);
X(const X&);
~X()
};
X f(X);
void g()
{
X a(1);
X b = f(X(2)); //identical to what you have:
a = f(a);
}
И в нем говорится:
12.2/2 Временные объекты
Здесь реализация может использовать временную структуру X (2), прежде чем передать его в f(), используя X copy-constructor; альтернативно, X (2) может быть построено в пространстве, используемом для аргумент. /.../
После этого стандарт объясняет оптимизацию возвращаемого значения, что в основном одно и то же.
Таким образом, это фактически не имеет никакого отношения к наблюдаемому поведению, это зависит от компилятора.