结构重新绑定::其他是什么意思

What does struct rebind::other mean?

本文关键字:其他 是什么 意思 绑定 新绑定 结构      更新时间:2023-10-16

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

我已经阅读了一些关于实现自定义分配器的阅读,并且对struct rebind的语义有点困惑。

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

其成员类型"其他"是等效的分配器类型,用于分配类型为"类型"的元素

我不明白other是如何成为struct rebind的成员.我发现struct rebind的定义如下所示:

template <class Type> struct rebind {
  typedef allocator<Type> other;
};

我不明白other是如何成为struct rebind的成员变量。这只是typedef编辑。如果我确实在全局命名空间中typedef int foo;,这并不意味着在全局命名空间中声明了 int 类型的全局变量,那么反过来,other如何成为 struct rebind 的成员?

顺便说一句,我知道(或者至少我已经读过(这在 C++11 之后都得到了简化,但我仍然想先了解这一点,以便我了解我的基本原理。感谢您的任何帮助。

在这个话题上,有人也可以解释一下结构内typedef处理吗?我以前在回答者约翰内斯·绍布(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;
}

这句话decltype(a1)::rebind<std::string>::other a2_1;std::allocator<std::string> a2_1;不是很长吗?

我不明白其他是如何成为struct rebind的成员变量.

不是。

这只是typedef编辑。

没错。正如报价所说,这是一种成员类型

在这个主题上,有人也可以解释结构中的类型定义交易吗?我以前在回答者约翰内斯·绍布(Johannes Schaub(的这个惊人例子中见过一次,但我还没有完全理解它。

很难给出一个不会简单地有相同问题的例子(因为你没有说明你对 litb 的例子有什么不理解(,但我们来了:

struct Foo
{
   typedef int bar;
};
Foo::bar x = 42;  // creates an int named `x`, because Foo::bar is int

对我来说,它看起来像是将 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>(。这在编写模板时很重要。