:: operator()做什么?

时间:2011-01-14 01:26:32

标签: c++ operator-keyword

    struct reserved_memory
    {
     void *safety;
     size_t safety_size;
     reserved_memory(size_t size) : safety_size(size)
     {
       init();
     }

     bool use() {
        if (safety) {
            ::operator(safety); 
            safety=0;
            return true;
        } else
            return false;
     }
    private:
     void init() 
     {
        safety=::operator new(safety_size);
     }
   }

我有这个没有编译的代码 - 我以前也没见过这个。这是调用构造函数吗? struct ...

中没有重载()运算符

5 个答案:

答案 0 :(得分:6)

很明显,编写该代码的任何人都打算调用::operator delete(safety)

(证据:safety是一个指针;它是用::operator new(safety_size)初始化的,在他们错误地调用::operator(safety)之后,他们将其重置为零。

至于整个代码的目的,我不知道 - 看起来它可能是一个非常差的设计的一部分。

Ken Bloom为代码的目的提供了一个合理的答案:保留一些紧急记忆,以便在可怕的情况下释放(给予足够的喘息空间以便能够发出错误信息)。有关详细信息,请参阅his answer

答案 1 :(得分:5)

关于此代码似乎正在做什么的说明:

在旧版Mac上(在MacOS X之前,可能还在某些低内存手持系统上),您曾经保留一些内存作为安全保护,以便在内存不足时可以将其释放,以便您可以使用它来警告用户有什么不对劲并保存他们的所有工作。我在Jim Trudeau的Macintosh Starting Kit中看到了这种技术。

所以这似乎是同样的事情 - 按大小保留一块内存,并在需要时释放它。显然,程序员不想使用safety=new char[safety_size]delete[] safety这个更常见的习语。

答案 2 :(得分:1)

您正试图在operator()上调用免费功能void*。据我所知,这不存在。因此,它不会为您编译。

如果我对你在这里想要完成的任何事情有任何想法,我会提供其他建议。

答案 3 :(得分:1)

虽然::operator delete()答案显然是正确的,但这里的人仍然缺少关于()运算符的语法细微之处。

  1. 这不能调用名为operator的方法,因为operator是保留字。

  2. 如果代码试图调用一个重载的括号运算符,它应该说operator()(safety) - 第一个()告诉你它是括号运算符,第二个传递参数。< / p>

  3. 即使您要解决这个问题,::operator()(safety)(在全局范围内定义)也不可能存在,因为(我会在这里引用G ++,因为它说得比我好){{ 1}}。

答案 4 :(得分:0)

你拥有的不是合法的C ++。它将函数调用运算符称为在全局范围内声明的自由函数。在任何范围内将函数调用运算符声明为自由函数是不合法的。它必须声明为非静态成员函数。

如果它是合法的,它将调用一个看起来像这样的函数:

void operator ()(void *foo)
{
   ::std::cout << "operator()(void *)\n";
}

但是如果你把这样的代码放到编译器中,编译器会告诉你它不合法。