код:
return socket;
пытается создать копию сокета для возврата, а затем уничтожить исходный сокет при выходе из функции. К сожалению, сокеты не могут быть скопированы (они управляют базовым ресурсом операционной системы, который должен быть закрыт, поэтому система должна гарантировать, что существует только одна ссылка на этот ресурс, в противном случае все может пойти не так, если первая копия выйдет из области действия). *
Как предложено в другом ответе, вы можете использовать указатель для возврата объекта, созданного в куче (которым нужно управлять либо с помощью shared_ptr, либо более эффективно, если вы используете его только в одном месте unique_ptr), или если вы используете C ++ 11, вы можете использовать конструктор перемещения для возвращаемого значения:
return std::move (socket);
Это позволит избежать необходимости использовать выделение кучи и указатели, поэтому, вероятно, это предпочтительное решение.