Out parameters and the strong exception guarantee
Justin Johansson
no at spam.com
Wed Jun 9 07:18:24 PDT 2010
bearophile wrote:
> Michel Fortin:
>
>> But if one of your function has an 'out' parameter, it's impossible to
>> implement the strong guarantee, as illustrated by this trivial example:
>>
>> void testOut(out int a) {
>> throw new Exception("hello!");
>> }
>>
>> void main() {
>> int a = 2;
>> try
>> testOut(a);
>> finally
>> writeln(a);
>> }
>>
>> Prints:
>>
>> 0
>> object.Exception: hello!
>>
>> This happens because the out parameter gets reset to its default value
>> as soon as you enter the function, so you can't throw an exception
>> before it has been changed.
>>
>> So should 'out' be reformed to behave more like a return value? I'm not
>> sure. But I think this is something to keep in mind when using out
>> parameters.
>
>
> In a recent post here:
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=110908
> and in some successive answers I have tried to explain that out arguments are a hack, they aren't as logically clean as multiple return values. I didn't think about exceptions too, your example adds one more case to what I was saying there. Thank you.
>
> Bye,
> bearophile
I re-read that recent post of yours in the context of this new post and
I must say that I agree with you. The ability to return mutiple return
values, as a tuple of sorts, is a good idea. Short of this a stronger
type system with existential typing (cardinalities) would suffice. Of
course that might bring us into a discussion about nullable types which
is which is which is which is which is a recursive topic on this ng.
Regards
Justin
More information about the Digitalmars-d
mailing list