struct rebind :: other是什么意思?

时间:2016-09-05 21:44:20

标签: c++ memory memory-management

这个问题来自我之前的问题:Why shouldn't C++ operator new/delete/variants be in header files?。为了快速总结,我正在学习覆盖全局运算符newdelete等。我现在需要一个自定义分配器类(我的重载运算符新调用std::set::insert(...),这似乎本身叫new,因此无限回归)。我认为如果我向我的malloc提供自定义分配器(例如,使用new而不是std::set),我可以绕过无限递归。

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

这里有一个很好的Q& A:Parsing allocator::rebind calls,但我仍然对一个特定的项目感到困惑。 cplusplus.com说struct rebind

  

其成员类型other是等效分配器类型,用于分配类型为

的元素

我不明白other如何成为struct rebind的成员。我发现struct rebind的定义如下:

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

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

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

在这个主题上,有人也可以在结构中解释typedef的交易吗?我曾经在应答者约翰内斯·绍布(Johannes Schaub)的amazing example中见过它,但我还没有完全理解它。对我而言,它似乎将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;吗?

1 个答案:

答案 0 :(得分:4)

  

我不知道其他人是struct rebind的成员变量。

不是。

  

它只是typedef编辑。

那是对的。它就是类型的成员,就像报价所说的那样。

  

在这个主题上,有人也能解释一下结构中的typedefing处理吗?我在回答者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>是什么都有效的方式(因此结果可能根本不是create)。当你编写模板时,这很重要。