Hello all,
Consider a struct that wraps a pointer to some other piece of
data as follows:
struct MyWrapper(T)
{
private T* data;
public this(ref T input)
{
this.data = &input;
}
... other methods that use `this.data` ...
}
Is there any way to guarantee at compile time that the input data
will outlive the wrapper struct?
I'd assumed (dangerous thing to do...) that DIP25 would allow
this to be guaranteed by `return ref`, but compiling/running the
following program, with or without the --dip25 flag, would appear
to suggest otherwise:
////////////////////////////////////////////////////////////
struct MyWrapper(T)
{
private T* data;
public this(return ref T input)
{
this.data = &input;
}
public T get() return
{
return *(this.data);
}
invariant()
{
assert(this.data !is null);
}
}
auto badWrapper()
{
double x = 5.0;
return MyWrapper!double(x);
}
void main()
{
import std.stdio;
auto badWrap = badWrapper();
writeln(badWrap.get());
}
////////////////////////////////////////////////////////////
Is there any current way to achieve what I'm looking for here, or
is this all on a hiding to nothing? :-(
N.B. for motivation behind this request, see:
https://github.com/WebDrake/dxorshift/pull/1