I was chatting on IRC. One of the topic was about a "@nogc" thread. I suggested something like "core.thread.NoGcThread" that would take a "@nogc" function but then i realized that this hypothetical class could still be allocated on the GC heap. So "new" and "delete" would have to be disabled...Despite of being deprecated it appears that class allocators and deallocators can be used for that purpose, without compiler changes:

---
class Foo
{
    @disable new (size_t size){return null;}
    @disable delete (void* p){}
}

void main()
{
    static assert(!__traits(compiles, new Foo));
    import std.experimental.allocator;
    import std.experimental.allocator.mallocator;

    auto f = make!Foo(Mallocator.instance);
    dispose(Mallocator.instance, f);

    // auto g = new Foo, // doesn't work
}
---

What's the point ?

- It's fun to discover that.
- Libraries that don't want their aggregates to reside on the GC heap can use this, with a mixin. (note: although the GCAllocator can still be used...)


Reply via email to