为什么sgi stl源代码在operator new函数前面使用双冒号?

ric*_*d.g 13 c++ stl

我正在阅读SGI标准模板库的源代码.我发现operator new函数前面总是有一个双冒号.像这样:

T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
Run Code Online (Sandbox Code Playgroud)

operator new可以在不添加::字段的情况下直接调用,那么为什么stl编码器会以这种方式编写它?如果我们不在::他们面前使用,可能会遇到什么陷阱或情况.

Mad*_*ist 9

您可以为类重载operator new,并在其前面添加"::"将调用全局"default"运算符new而不是可能的重载.例如:

#include <iostream>

class Foo
{
public:
  Foo() { std::cout << "Foo::Foo()" << std::endl; }

  void * operator new(size_t )
  { 
    std::cout << "Foo::operator new()" << std::endl; 
    return static_cast<Foo *>(malloc(sizeof(Foo)));
  }
};


int main()
{
  Foo foo;
  std::cout << "----------------------" << std::endl;
  Foo * p = new Foo;
  std::cout << "----------------------" << std::endl;
  Foo * q = ::new Foo;
}
Run Code Online (Sandbox Code Playgroud)

将打印

Foo::Foo()
----------------------
Foo::operator new()
Foo::Foo()
----------------------
Foo::Foo()
Run Code Online (Sandbox Code Playgroud)

编辑:剪切的代码确实不是关于在类范围中定义的operator new.一个更好的例子是:

#include <iostream>

namespace quux {

void * operator new(size_t s)
{
  std::cout << "quux::operator new" << std::endl;
  return malloc(s);
}

void foo()
{
  std::cout << "quux::foo()" << std::endl;
  int * p = static_cast<int*>(operator new(sizeof(int)));
}

void bar()
{
  std::cout << "quux::bar()" << std::endl;
  int * p = static_cast<int*>(::operator new(sizeof(int)));
}

} // namespace quux


int main()
{
  quux::foo();
  quux::bar();
}
Run Code Online (Sandbox Code Playgroud)

打印

quux::foo()
quux::operator new
quux::bar()
Run Code Online (Sandbox Code Playgroud)