Why do I get this error when casting to an immutable or shared byRef return type?

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jun 19 05:54:17 PDT 2016


On 06/19/2016 12:45 PM, Gary Willoughby wrote:
> On Sunday, 19 June 2016 at 10:35:59 UTC, Gary Willoughby wrote:
>> ...
>
> A more correct example:
>
> import core.stdc.stdlib;
> import std.traits;
>
> ref T foo(T)()
> {
>      alias Type = Unqual!(T);
>
>      Type* foo = cast(Type*) malloc(Type.sizeof * 8);
>
>      return *foo;
> }
>
> void main(string[] args)
> {
>      // Works!
>      auto bar = foo!(int)();
>
>      // Works!
>      auto bar = foo!(const(int))();
>
>      // Error: cast(immutable(int))*foo is not an lvalue
>      auto bar = foo!(immutable(int))();
>
>      // Error: cast(shared(int))*foo is not an lvalue
>      auto bar = foo!(shared(int))();
> }

At the core, int* doesn't implicitly convert to immutable(int)*.

Equally, a mutable int doesn't implicitly convert to an immutable one 
with the same address. That conversion makes a copy, so the result is an 
rvalue and you can't take it's address.

A mutable int does implicitly convert to a const one with the same 
address, because const is fine with the value changing through the 
mutable view. immutable would not be fine with that, so it's rejected.

Same with shared, of course.


More information about the Digitalmars-d-learn mailing list