【发布时间】:2017-02-16 18:16:24
【问题描述】:
首先让我说明我正在使用不支持移动构造函数的 GNU C++ 编译器。它只支持98标准。
鉴于此,我想编写一个 C++ 类,它以遵循 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);
}
我发现 vector 使用复制构造函数来移动对象,然后破坏旧的套接字。这具有调用关闭我的文件描述符的 closeSocket() 的不幸副作用。
我想在调用对象的析构函数时遵循 RAII 并关闭文件描述符,但它使我无法在 STL C++ 容器内使用它。我知道我可以更新我的编译器并实现一个可以解决问题的移动构造函数,但我为一家不相信使用任何现代产品的公司工作。 (我真的很沮丧,但对此我无能为力。)
【问题讨论】:
-
尝试更改复制构造函数并删除
const,然后在复制后将other.m_sockfd设置为-1。您可能还想考虑operator=。 -
@RichardCritten 如果没有 const 引用,您将无法拥有复制构造函数。你的建议毫无意义
-
@DavidHaim 是的,你可以:"类 T 的复制构造函数是一个非模板构造函数,其第一个参数是 T&、const T&、volatile T& 或const volatile T&"(我的粗体字)请参阅:en.cppreference.com/w/cpp/language/copy_constructor 它不会复制临时对象 - 这就是我在帖子中说“尝试”的原因。