automate tuple creation

Steven Schveighoffer schveiguy at gmail.com
Fri Jan 21 01:12:55 UTC 2022


On 1/20/22 6:01 PM, forkit wrote:
> On Thursday, 20 January 2022 at 22:31:17 UTC, Steven Schveighoffer wrote:
>>
>> Because it would allow altering const data.
>>
> 
> I'm not sure I understand. At what point in this function is valuesArray 
> modified, and thus preventing it being passed in with const?

The compiler rules aren't enforced based on what code you wrote, it 
doesn't have the capability of proving that your code doesn't modify things.

Instead, it enforces simple rules that allow prove that const data 
cannot be modified.

I'll make it into a simpler example:

```d
const int[] arr = [1, 2, 3, 4 5];
int[] arr2 = arr;
```

This code does not modify any data in arr. But that in itself isn't easy 
to prove. In order to ensure that arr is never modified, the compiler 
would have to analyze all the code, and every possible way that arr2 
might escape or be used somewhere at some point to modify the data. It 
doesn't have the capability or time to do that (if I understand 
correctly, this is NP-hard).

Instead, it just says, you can't convert references from const to 
mutable without a cast. That guarantees that you can't modify const 
data. However, it does rule out a certain class of code that might not 
modify the const data, even if it has the opportunity to.

It's like saying, "we don't let babies play with sharp knives" vs. "we 
will let babies play with sharp knives but stop them just before they 
stab themselves."

-Steve


More information about the Digitalmars-d-learn mailing list