----- import std.traits; ref int foo(ref int); void main() { alias ReturnType!foo function(ParameterTypeTuple!foo) Bar; int x; Bar bar; static assert(!__traits(compiles, bar(5) )); // ok, can't take r-value static assert(__traits(compiles, bar(x) )); // ok, takes l-value pragma(msg, Bar); // 'int function(ref int)' -- missing ref return bar(x) = 5; // Error: (*bar)(x) is not an lvalue } -----
But "ref" is not a type ctor (https://dlang.org/spec/declaration.html#typequal_vs_storageclass). The alias returned by ReturnType type is correct.