Am 23.09.2013 17:02, schrieb Adam D. Ruppe:
We should really deprecate the new keyword. It'd break like all code
ever, but with D's templates, there's no need for it, and when it is
there, it is going to spark problems about replacing global allocators
or the library allocators being second class citizens.


Its not possible to replace new with a library function in all cases. There are many examples where it breaks (I tried it believe me). Just let me give a few:


class A
{
  class B
  {
  }

  B m_b;

  this()
  {
    // uses the sourrounding context
    // not possible with library function
    m_b = new B();
  }
}

Also there is the problem that D does not have perfect forwarding. That means if "new" is a library function it will cause additional copies / moves of structs which are not the case with the buildin new. Next there are implict conversions of literals. Those work just fine with the buildin new, but will break with a templated library new.

E.g.

class C
{
  this(ubyte a, ubyte b)
  {
  }
}

new C(5,3); // fine
New!C(5,3); // Error: can not implicitly convert int to ubyte

Unless of course you want to write a template metaprogram that does those implict conversions. Although the problem would remain that you can't know if the value you get comes from a literal or from a function call, variable, etc.

The next thing are arrays. While you get the nice array syntax with the buildin new, a library new just looks ugly.

new int[5];
vs.
NewArray!int(5); // Can't use New! here because it would conflict with the New! for creating objects / structs

I'm using library implemented new / delete since over a year and its annoying and makes the language look ugly and feel strange to use. See my allocator and New / Delete implementation here:

https://github.com/Ingrater/druntime/blob/master/src/core/allocator.d

I would rather want new to be overloadable and have 2 sets of parameters

new (allocator)(arg1, arg2)

Where "allocator" would go to the overloaded version of new and "arg1" and "arg2" will be passed to the constructor.

I think its a really bad idea to deprecate new.

Replacing Delete works just fine with a library function though.

Kind Regards
Benjamin Thaut

Reply via email to