Спорная линия такова:
test var = 123;
Соответствующим стандартным текстом (на который ссылаются эксперты в комментариях), я полагаю, является (8.5, "Заявители"):
Выбранная функция вызывается с выражением инициализатора в качестве аргумента; если функция является конструктором, то вызов инициализирует временную версию cv-unqualed-определенной версии целевого типа. Временное значение. Результат вызова (который является временным для случая конструктора) затем используется для прямой инициализации, в соответствии с приведенными выше правилами, объекта, который является местом назначения инициализации копирования. В некоторых случаях реализация позволяет исключить копирование, присущее этой прямой инициализации, путем создания промежуточного результата непосредственно в инициализируемый объект ;
Действительно, в 12.6 мы получаем пример этого:
complex f = 3; // construct complex(3) using
// complex(double)
// copy it into f
Таким образом, при использовании =
ваша реализация , вероятно, напрямую создает объект и полностью исключает промежуточный временный объект (и, как отмечалось в комментариях, большинство делает).
Этот класс не копирует должным образом, поэтому создание его копии (и освобождение копии и оригинала) приведет к двойному удалению (и сбоям, неопределенному поведению и т. Д.). Поскольку копии не создаются, этот сценарий не происходит выше.