Во втором случае вы выполняете задание, а не строительство. Вы не определили свою собственную версию оператора копирования-назначения, что означает, что компилятор предоставит ее вам. Предоставленный компилятором оператор присваивания копии будет неявно объявлен как
Vector2f& operator =(const Vector2f& rhs);
Обратите внимание, что единственный параметр этого оператора имеет тип "ссылка на константу".
В вашем коде вы настаиваете на предоставлении временного значения объекта типа Vector2f
в правой части назначения.
tempVector2 = Vector2f(0.0f, 0.0f);
Это означает, что ссылочный параметр operator =
инициализируется временным значением типа класса. В соответствии со спецификацией языка (8.5.3 / 5), компилятору разрешено копировать этот временный объект столько раз, сколько ему нужно, прежде чем фактически присоединить ссылку. В конце концов он должен прекратить копирование и, наконец, вызвать оператора. Обычно компилятор не сходит с ума от копирования (большинство из них вообще не копируют), однако в вашем случае это кажется проблемой. По какой-то причине ваш компилятор блокируется в бесконечном цикле копирования, никогда не останавливая его. Я не знаю, что вызывает это. Может быть ошибка в компиляторе.
Обратите внимание, что даже в
tempVector2 = Vector2f(tempVector1);
вы все еще предоставляете правую часть в виде временного значения. Значение r является результатом явного приведения к Vector2f
, который вы по какой-то причине поместили туда. Я понятия не имею, почему ты это сделал. Если проблема действительно в компиляторе (а не в коде, который вы нам не показываете), я уверен, что если вы просто сделаете
tempVector2 = tempVector1;
задание будет выполнено без проблем. Вот как вы можете обойти эту проблему, если она окажется ошибкой в компиляторе: прекратите использовать временные символы в качестве аргументов оператора копирования и копирования-назначения.