On Saturday, June 03, 2017 05:52:55 vit via Digitalmars-d-learn wrote: > Hello, > What's the difference between x = Nullable!Test.init and > x.nullify? > > > class Test{} > > void test()pure nothrow{ > Nullable!Test x; > > x = Nullable!Test.init; //OK > x.nullify; //Error: function > 'std.typecons.Nullable!(Test).Nullable.nullify!().nullify' is not > nothrow > > }
Assigning Nullable!Test.init is equivalent to setting the internal value to Test.init and setting _isNull to false. nullify doesn't assign Nullable!Test.init to the Nullable!Test, and it doesn't assign Test.init to _value. Rather, it calls destroy on _value and sets _isNull to true. Exactly what destroy does depends on the type. In the case of a class, it calls rt_finalize on it, which basically calls the class' finalizer (if it has one). But rt_finalize is not nothrow, so destroy isn't nothrow, so nullify isn't nothrow. However, looking at what rt_finalize does, I don't see why it couldn't be nothrow. So, unless I'm missing something, it seems like that would be a good enhancement. - Jonathan M Davis