struct rebind::other 是什么意思?

Sto*_*row 2 c++ memory memory-management

这个问题来自我之前的一个问题:为什么 C++ 运算符 new/delete/variants 不应该出现在头文件中?. 快速总结一下,我正在学习覆盖全局 operator newdelete等。我现在需要一个自定义分配器类(我的重载 operator new call std::set::insert(...),它本身似乎是 call new,因此无限回避)。我认为,如果我向我提供自定义分配器(例如,使用malloc而不是new),我std::set可以绕过无限递归。

我已经阅读了一些关于实现自定义分配器的文章,但对struct rebind.

这里有一个很好的问答:解析分配器::重新绑定调用,但我仍然对一个特定项目感到困惑。cplusplus.com 说struct rebind

它的成员类型 other 是分配类型类型元素的等效分配器类型

我不明白怎么other是其成员struct rebindstruct rebind我发现的定义如下:

template <class Type> struct rebind {
  typedef allocator<Type> other;
};
Run Code Online (Sandbox Code Playgroud)

我看不出other是一个成员变量struct rebind。这只是typedefed。如果我typedef int foo;在全局命名空间中做了,那并不意味着int在全局命名空间中声明了一个类型为全局的变量,那么反过来,如何other成为 的成员struct rebind

顺便说一下,我知道(或者至少我已经读过)这在 C++11 之后都被简化了,但我仍然想先了解这一点,这样我才能了解我的基础知识。谢谢你的帮助。

在这个主题上,有人还可以解释typedef在结构中处理ing 的问题吗?我以前在回答者 Johannes Schaub 的这个惊人的例子中见过一次,但我还没有完全理解它。在我看来,它似乎将 typedef 的范围限制在包含结构的实例内。

更新:

我想将此添加到我的问题中。使用来自 cppreference.com 的这个删节示例:

#include <memory>
#include <iostream>
#include <string>

int main()
{
    std::allocator<int> a1; // default allocator for ints

    decltype(a1)::rebind<std::string>::other a2_1;
}
Run Code Online (Sandbox Code Playgroud)

这条线不是decltype(a1)::rebind<std::string>::other a2_1;说得很长std::allocator<std::string> a2_1;吗?

Lig*_*ica 5

我不知道 other 是struct rebind.

它不是。

这只是typedefed。

这是正确的。正如引用所说,它是一个成员类型

在这个主题上,有人还可以解释在结构中进行类型定义的处理吗?我以前在回答者 Johannes Schaub 的这个惊人的例子中见过一次,但我还没有完全理解它。

很难给出一个不会简单地遇到相同问题的示例(因为您没有说明您对 litb 示例不了解的内容),但我们继续:

struct Foo
{
   typedef int bar;
};

Foo::bar x = 42;  // creates an int named `x`, because Foo::bar is int
Run Code Online (Sandbox Code Playgroud)

在我看来,它似乎将 typedef 的范围限制在包含结构的实例内。

这是正确的。结果类型是类的成员,就像嵌套类一样,就像类是其封闭命名空间的成员一样。

顺便说一句,我知道(或者至少我已经读过)这在 C++11 之后都被简化了

不,成员类型在语言的任何修订版中都没有发生根本性的变化(尽管新using语法可以选择使声明它们更容易)。

如果我typedef int foo;在全局命名空间中做了,那并不意味着int在全局命名空间中声明了一个类型为全局变量

不,但是会在全局命名空间中调用一个类型foo

这条线不是decltype(a1)::rebind<std::string>::other a2_1;说得很长std::allocator<std::string> a2_1;吗?

是的; 很长的路要走,不管是什么a1都行得通(所以结果可能根本不是std::allocator<T>)。这在您编写模板时很重要。