This means that if a constant string is passed as a parameter not declared as const, it should not be allowed (Pascal case?), or a temporary copy with descriptor should be passed.A temporary copy is created inside the procedure. If you haven't explicitly declared the parameter as const, then for managed types it means something like this:
Either way, if const and constref both pass strings that cannot be changed inside the procedure, why have constref?There is no difference in the current implementation for strings.
I guess you're asking because you plan on supporting strings in SharpBasic. right ?
As far as I understood it, the CONST meaning of most architecture's ABIs can vary on if a structure is passed by reference, copied on the stack first and then by value, or passed in registers etc. Also, the cutoffs ( structs under <xx> bytes by value, larger by reference) can vary.
However in the original x86 ABI this meant it was mostly passed by reference. This lead to heaps of Delphi (and FPC) x86 only code assuming that CONST meant by-ref, even if that was in violation of the ABI of architectures that had more registers for parameter passing (like PPC 64)
Constref is mostly for the case some code forcedly needs CONST to be by ref, like the above old x86 only code.
CONST is redefined as being ABI compliant, and the exact meaning might thus vary with architecture.