Thread overview
A strange charArray.ptr behavior
Dec 02, 2020
Ferhat Kurtulmuş
Dec 02, 2020
Ali Çehreli
Dec 03, 2020
Ferhat Kurtulmuş
December 02, 2020
given the function:

export void ceaser_enc(char* input, ref char* output);

this compiles:
    char* sezar = (new char[65]).ptr;
    ceaser_enc(key, sezar);

this does not compile:

    char[] sezar = new char[65];
    ceaser_enc(key, sezar.ptr);

by yielding: "cannot pass rvalue argument cast(char*)sezar of type char* to parameter ref char* output"

Why is sezar an rvalue in the second case?
December 02, 2020
On 12/2/20 12:20 PM, Ferhat Kurtulmuş wrote:
> given the function:
> 
> export void ceaser_enc(char* input, ref char* output);
> 
> this compiles:
>      char* sezar = (new char[65]).ptr;
>      ceaser_enc(key, sezar);
> 
> this does not compile:
> 
>      char[] sezar = new char[65];
>      ceaser_enc(key, sezar.ptr);
> 
> by yielding: "cannot pass rvalue argument cast(char*)sezar of type char* to parameter ref char* output"
> 
> Why is sezar an rvalue in the second case?

Not 'sezar' but sezar.ptr is an rvalue. Imagine ptr() being a function that returns a value:

T* ptr() {
  // ...
}

That pointer is an rvalue and D disallows binding them to 'ref' parameters.

In the first case, 'sezar' is a local variable, which is an lvalue.

Ali

December 03, 2020
On Wednesday, 2 December 2020 at 21:01:22 UTC, Ali Çehreli wrote:
> On 12/2/20 12:20 PM, Ferhat Kurtulmuş wrote:
>> given the function:
>> 
>> export void ceaser_enc(char* input, ref char* output);
>> 
>> this compiles:
>>      char* sezar = (new char[65]).ptr;
>>      ceaser_enc(key, sezar);
>> 
>> this does not compile:
>> 
>>      char[] sezar = new char[65];
>>      ceaser_enc(key, sezar.ptr);
>> 
>> by yielding: "cannot pass rvalue argument cast(char*)sezar of type char* to parameter ref char* output"
>> 
>> Why is sezar an rvalue in the second case?
>
> Not 'sezar' but sezar.ptr is an rvalue. Imagine ptr() being a function that returns a value:
>
> T* ptr() {
>   // ...
> }
>
> That pointer is an rvalue and D disallows binding them to 'ref' parameters.
>
> In the first case, 'sezar' is a local variable, which is an lvalue.
>
> Ali

That makes sense. Thank you.