DIP53 and DIP49 (ver2) - New definitions for qualified constructors and postblits
Maxim Fomin
maxim at maxim-fomin.ru
Thu Dec 19 03:22:57 PST 2013
On Thursday, 19 December 2013 at 07:31:28 UTC, ilya-stromberg
wrote:
> What should we do if we decide that we need REAL `const`
> postblit/constructor? I mean postblit/constructor that creates
> only `const` object that can't be implicitly converted to the
> `mutable` or `immutable`.
D is not C/C++. Objects are either mutable or immutable.
Sometimes you can view any of them through const. There are no
const objects per se.
> BTW, it looks like it's quite easy to implement `unique`
> storage class only for local scope (only for function body).
> For example:
>
> immutable(int)[] foo()
> {
> //it's unique variable because I created it
> unique arr = new unique int[2];
>
> //I can change unique variable because only I have reference
> for it
> arr[0] = 10;
> arr[1] = 20;
>
> //unique variable can be implicitly converted to the
> immutable variable
> return arr;
> }
>
> So, `unique` storage class allows to avoid unsafe
> `cast(immutable)` cast. It's often use case, see also
> `std.exception.assumeUnique`. So, I think it will be great to
> have reserved `unique` keyword for `unique` storage class.
Current implementation can be characterized by complete absence
of sane escape analysis.
import std.stdio;
import core.memory;
class A
{
int *ptr;
~this()
{
(*ptr)++;
}
}
pure foo()
{
A a = new A;
int* ptr = new int;
a.ptr = ptr;
a = null;
return ptr;
}
void main()
{
immutable int* ptr = foo();
writeln(*ptr); // it is 0
GC.collect();
writeln(*ptr); // it is 1 now
}
Your proposal suffers from same issue. Although idea of unique
can be worthy, without escape analysis it is another hole.
More information about the Digitalmars-d
mailing list