On Thu, 23 Dec 2010 14:51:02 -0500, spir <[email protected]> wrote:

On Thu, 23 Dec 2010 13:38:30 -0500
"Steven Schveighoffer" <[email protected]> wrote:

I think it's intentional, and I agree that I've never used or thought
"gee, I wish D did this". I wouldn't be sorry to see it go. In fact, I'd advocate for getting rid of it. It creates a hidden allocation, which I'm
very much against.

Agreed. Not only hidden allocation, but the "feature" may be unintentionally used, leading to hard-to-find bugs. There should never by (user) type instanciation without explicite mention of the type (if only on the left side of an assignment). Surprise --> bugs.

To drive the point home, we can examine the problem that typesafe variadic args solves. Take an array example. If we didn't have typesafe variadic args for arrays, this code:

void foo(int[] args...);

foo(1, 2, 3);

would become:

void foo(int[] args);

int[3] x;
x[0] = 1;
x[1] = 2;
x[2] = 3;
foo(x[]);

Not so nice. Almost the same issue for a typesafe variadic with fixed-sized arrays.

Now, let's look at the same thing for a class:

class C
{
   this(int i, string s);
}

void foo(C arg...);

foo(1, "hi");

And the code without typesafe variadics:

void foo(C arg);

foo(new C(1, "hi"));

Not a lot different, we have just basically shown that you are doing an allocation (which is a good thing to show).

Going even further, we can even do this:

void foo(int i, string s)
{
  foo(new C(i, s));
}

And then we get *exactly* the same api. This feature brings absolutely nothing to the table IMO.

-Steve

Reply via email to