Thread overview
Auto-casting the subexpressions of a ternary operator to the expected type
Apr 16, 2005
Larry Hastings
Apr 17, 2005
Regan Heath
Apr 17, 2005
J C Calvarese
April 16, 2005

This isn't a *bug*, per se, but an area where I think D (and many other C-like languages) could arguably be improved.

The ternary operator doesn't like having objects of different types for the if and else subexpressions.  Since the compiler already knows the ultimate type for the expression en toto, it'd be nice if it propogated down to the if and else subexpressions so that they could be auto-demoted to the proper type.

Here's what I mean:
//
class classA
	{
	int i;
	}

class classB : classA
	{
	int j;
	}

class classC : classA
	{
	int k;
	}

void polymorphic(classA a)
	{
	printf("a.i is %d\n", a.i);
	}

int main()
	{
	classB b = new classB;
	b.i = 4;
	polymorphic(b);

	classC c = new classC;
	c.i = 5;
	polymorphic(c);

	// Ternary operator with explicit casts.
	// This statement compiles and runs.
	polymorphic((b.i < c.i) ? cast(classA)b : cast(classA)c);

	// Ternary operator with implicit casts.
	// This statement won't compile.
	polymorphic((b.i < c.i) ? b : c);

	return 0;
	}
//

I think the "ternary operator with implicit casts" call should be equivalent to the "ternary operator with explicit casts" call.  My gut feeling is that this wouldn't become a source of surprises (aka bugs). I think the coder's intent in these cases would be clear.

p.s. Is the convention in this newsgroup for "here's some inline code" a hashmark (#) at the beginning of every line of the code?  I admit it's been some years since I hung out in a newsgroup.

--
/larry/
April 17, 2005
On Sat, 16 Apr 2005 10:01:50 -0700, Larry Hastings <larry@hastings.org> wrote:
> p.s. Is the convention in this newsgroup for "here's some inline code" a hashmark (#) at the beginning of every line of the code?  I admit it's been some years since I hung out in a newsgroup.

Or | of any character you like. The intention is to preserve the indentation of code. Some readers/writers munge it.

Regan
April 17, 2005
Larry Hastings wrote:
> 
...
> p.s. Is the convention in this newsgroup for "here's some inline code" a hashmark (#) at the beginning of every line of the code?  I admit it's been some years since I hung out in a newsgroup.
> 
> -- 
> /larry/

I think the convention was mostly designed for people posting from the web interface (which has a nasty habit of deleting leading spaces). Since you're posting from a newreader that doesn't chop off leading spaces, I'd just keep on doing what you're doing. Obviously,

void main()
{
    printf("hello world");
}

is code.


void main()
{
printf("hello world");
}

is clearly code, too, but it's not as easy to read (especially when several blocks get nested).

-- 
jcc7
http://jcc_7.tripod.com/d/