xxxxxxxxxx
import std.traits : CopyTypeQualifiers;
struct Ptr(T)
if(is(T == struct)){
private void* ptr;
static if(is(T == const))
this(ref const typeof(this) x) {
this.ptr = cast(typeof(this.ptr))x.ptr;
}
this(ref typeof(this) x) {
this.ptr = x.ptr;
}
this(ref const typeof(this) x)const {
this.ptr = x.ptr;
}
this(P : const Ptr!(U), U, this This)(auto ref P x)
if(true
//&& !is(R == T)
&& is(CopyTypeQualifiers!(P, U)* : CopyTypeQualifiers!(This, T)*)
){
this.ptr = cast(typeof(this.ptr))x.ptr;
}
}
struct Foo{
//@disable this(this);
}
T get_rvalue(T)(){
return T.init;
}
void main() {
///normal pointers
{
const(const(Foo)*) cpcf; ///const(Foo*)
const(Foo*) cpf1 = cpcf; ///OK
const(Foo*) cpf2 = get_rvalue!(const(const(Foo)*)); ///OK
const(Foo)* pcf1 = cpcf; ///OK
const(Foo)* pcf2 = const(const(Foo)*).init; ///OK
const(Foo)* pcf3 = get_rvalue!(const(const(Foo)*)); ///OK
}
//wrapped ptr:
{
const Ptr!(const Foo) cpcf;
const Ptr!(Foo) cpf1 = cpcf; ///OK
const Ptr!(Foo) cpf2 = get_rvalue!(const Ptr!(const Foo)); ///OK
Ptr!(const Foo) pcf1 = cpcf; ///OK
Ptr!(const Foo) pcf2 = const(Ptr!(const Foo)).init; ///OK
Ptr!(const Foo) pcf3 = get_rvalue!(const Ptr!(const Foo)); ///ERROR!
}
}