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

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

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



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

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

我看不到otherstruct rebind的成员变量。这只是typedef ed。如果我在全局 namespace 中执行了typedef int foo;,那并不意味着在全局 namespace 中声明了一个类型为int的全局变量,那么other又如何成为struct rebind的成员呢?

顺便说一句,我知道(或者至少我读过)在C++ 11之后,这一切都得到了简化,但是我仍然想首先理解这一点,这样我才能掌握基础知识。谢谢你的帮助。

在这个主题上时,有人还能在结构中解释typedef的处理吗?我以前在回答者Johannes Schaub的amazing example中看到过它,但是我还没有完全理解它。对我来说,它似乎将typedef的范围限制在包含struct的实例内。

更新:

我想将此添加到我的问题中。使用来自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;的好方法吗?

最佳答案



不是。



那就对了。正如引用一样,它是成员类型。



很难给出一个不会简单地遇到相同问题的示例(因为您没有陈述您对litb的示例不了解的地方),但是我们开始:

struct Foo
{
   typedef int bar;
};

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



那就对了。结果类型是类的成员,就像嵌套的类一样,就像类是其封闭的 namespace 的成员一样。



不,成员类型在该语言的任何版本中都没有根本改变(尽管新的using语法使声明它们更加容易)。



不,但是全局 namespace 中将存在一个名为foo的类型。



是;很长的路要走,不管a1是什么,它都可以工作(因此结果可能根本不是std::allocator<T>)。在编写模板时,这一点很重要。

关于c++ - struct rebind::other是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39338032/

10-13 08:09