Вы сталкиваетесь с тем, что вы не отметили свой конструктор как explicit
и, следовательно, его можно использовать для неявных преобразований.
new UE(true)
возвращает указатель. Все указатели могут быть неявно преобразованы в bool
, что приводит к true
, если они не равны нулю. UE
может быть неявно построена из bool
. Таким образом, указатель, возвращаемый new
, преобразуется в bool
, который преобразуется в UE
с использованием вашего конструктора, а затем вызывается оператор назначения копирования UE
. Разумеется, утечка памяти, выделенная new
.
Сообщение о возврате: всегда отмечайте конструкторы с одним аргументом как explicit
, если вы на самом деле не хотите, чтобы они были пригодны для неявных преобразований. Под «конструктором с одним аргументом» я имею в виду тот, который можно вызвать с помощью одного аргумента. Либо потому, что у него есть один параметр, либо он имеет больше и все параметры после первых аргументов по умолчанию.
Он компилируется в VS2010. – herohuyongtao
@herohuyongtao Вопрос в том, почему. Ответ - это неявные преобразования. – juanchopanza
@HenkHolterman 'new' возвращает указатель. –