Вопрос в том, почему деструктор вызывается 6 раз во время выполнения remove ()?
Итак, вызовы деструктора связаны с тем, что 2
неявно преобразуется вA
по remove()
.Каждый раз, когда результат такого неявного преобразования выходит из области видимости, вызывается деструктор A
.
Причина этих неявных преобразований заключается в том, что remove()
необходимо сравнить каждый элемент a
с2
.Единственный способ сделать это - вызвать A::operator==(const A&)
:
bool operator==(A const& rhs) { ... }
Поскольку rhs
имеет тип const A&
, компилятор:
- вызывает
A(int)
преобразуйте 2
в A
; - звонков
operator==(const A&)
; - звонков
A::~A()
для уничтожения временных.
Последние являютсявызовы деструктора, которые вы видите.
Если вы добавите следующий оператор сравнения к A
, вы увидите, что эти вызовы деструктора исчезнут:
bool operator==(int rhs) { return i_ == rhs; }
В качестве альтернативы, если выесли бы вы вызывали remove()
примерно так, вы увидите, что все вызовы деструктора bar one исчезают:
remove( v.begin(), v.end(), A(2) );
Наконец, если вы сделаете A::A(int)
explicit
, компилятор не позволит вамвызовите remove()
с 2
в качестве последнего аргумента (вам нужно будет вызвать его с A(2)
).