Почему компилятор не использовал Copy Ctor, а затем удалил локальный объект?
Потому что, как вы заметили, он использовал вместо этого конструктор перемещения. Был вызван конструктор перемещения, затем локальный объект был уничтожен. (Деструкторы вызываются, когда объект выходит из области видимости, даже если этот объект был перемещен из.)
Когда локальный объект был уничтожен, то, на что указывал его член ip
, было удалено. Обычно это хорошо, за исключением того, что перемещенный объект указывает на одно и то же. Возможно, вы захотите, чтобы ваш конструктор перемещения установил other.ip
в какое-то допустимое значение. (Я бы обычно предлагал nullptr
, но, похоже, ваш класс предполагает, что ip
никогда не является нулевым.)
Например:
B(B&& other) : ip(other.ip){
other.ip = new int(0);
}