Non-null objects, the Null Object pattern, and T.init
Walter Bright
newshound2 at digitalmars.com
Sat Jan 18 14:28:14 PST 2014
On 1/18/2014 2:16 PM, Michel Fortin wrote:
> It works, up to a point.
>
> void foo(RangedInt!(0, 5) a);
>
> void bar(RangedInt!(0, 10) a)
> {
> if (a < 5)
> foo(a); // what happens here?
> }
>
> In that "foo(a)" line, depending on the implementation of RangedInt you either
> get a compile-time error that RangedInt!(0, 10) can't be implicitly converted to
> RangedInt!(0, 5) and have to explicitly convert it, or you get implicit
> conversion with a runtime check that throws.
Yes, and I'm not seeing the problem. (The runtime check may also be removed by
the optimizer.)
> Just like pointers, not knowing about the actual control flow pushes range
> constrains enforcement at runtime in situations like this one.
With pointers, the enforcement only happens when converting a pointer to a
nonnull pointer.
> In fact, even the most obvious case can't be caught at compile-time with the
> template approach:
>
> void baz()
> {
> foo(999); // runtime error here
> }
Sure it can. Inlining, etc., and appropriate use of compile time constraints.
More information about the Digitalmars-d
mailing list