Позвольте мне начать с утверждения, что я использую компилятор GNU C++, который НЕ поддерживает конструкторы перемещения. Он поддерживает только стандарт 98.RAII, Berkeley Sockets и STL Containers
Учитывая, что я хочу написать класс C++, который объединяет сокеты стиля Berkeley простым способом, который следует за RAII. Вот очень простой класс:
class SimpleSocket
{
int m_sockfd;
public:
SimpleSocket()
{
m_sockfd = socket(AF_INET, ...);
}
SimpleSocket(const SimpleSocket& other)
{
m_sockfd = other.m_sockfd;
}
~SimpleSocket()
{
closeSocket();
}
void closeSocket()
{
if(m_sockfd != -1)
{
close(m_sockfd);
m_sockfd = -1;
}
}
};
Скажем, я хочу, чтобы создать целую кучу их в STL C++ вектор, как так.
vector<SimpleSocket> vec_of_sockets;
for(int i = 0 ; i < 10 ; ++i)
{
SimpleSocket new_sock;
vec_of_sockets.push_back(new_sock);
}
То, что я обнаружил, что вектор использует конструктор копирования для перемещения объектов вокруг, а затем разрушающие старые гнезда. У этого есть неудачный побочный эффект вызова closeSocket(), который закрывает мой файловый дескриптор.
Я хочу следовать за RAII и закрывать дескриптор файла при вызове деструктора объекта, но он делает его там, где я не могу использовать его внутри контейнеров STL C++. Я знаю, что могу обновить свой компилятор и реализовать конструктор перемещения, который бы устранил проблему, но я работаю в компании, которая не верит в использование чего-либо современного. (Я действительно разочарован им, но ничего не могу поделать.)
Попробуйте изменить конструктор копирования и удалите 'const', а затем установите' other.m_sockfd' в -1 после того, как вы его скопировали. Вероятно, вы также хотите подумать о 'operator ='. –
@RichardCritten у вас не может быть copy-constructor без ссылки const. ваше предложение бессмысленно –
@DavidHaim Да, вы можете: _ «Конструктор копирования класса T является конструктором без шаблона, первым параметром которого является __T & __, const T &, volatile T & или const volatile T & _ _ (мой полужирный): http : //en.cppreference.com/w/cpp/language/copy_constructor Он не будет копировать временные объекты - вот почему я сказал «Try» в своем сообщении. –