为什么 std::allocator<T>::allocate 调用 ::operator new?

Dan*_*ica 10 c++ new-operator allocator language-lawyer

成员函数的文档std::allocator<T>::allocate在 ( [allocator.members] ) 中说:

\n
\n

备注:数组的存储是通过调用 \xe2\x80\x8b::\xe2\x80\x8boperator new ([new.delete]) 获得的,但未指定该函数的调用时间和频率。该函数启动数组对象的生命周期,但不启动任何数组元素的生命周期。

\n
\n

我想知道为什么它说::operator new而不只是operator new?双冒号有什么区别吗?operator new如果省略了双冒号,这里可以调用哪个其他的?

\n

Art*_*yer 12

在LWG2818之前,[contents]p3读到:

x每当提到标准库中定义的名称时,除非另有明确说明,否则该名称x都被假定为完全限定为。::std::x例如,如果库函数的Effects : 元素F被描述为调用库函数,则表示G该函数。::std::G

因此,operator new在规范中写入将意味着::std::operator new,这是没有意义的。::operator new正确引用operator new全局命名空间。

operator new在标准库的实现中,编写和之间没有区别::operator new,因为std::allocator<T>不会定义成员operator new,并且 ADL 没有效果,因为只有一个operator new可以定义 free 的命名空间。

  • 这正是我一直在寻找的解释。谢谢!我不知道这个规则,今天学到了一些新东西。 (2认同)