Why do "const inout" and "const inout shared" exist?

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Sat Jul 1 23:08:07 PDT 2017


On 7/1/2017 9:49 PM, Timon Gehr wrote:
> On 02.07.2017 06:45, Walter Bright wrote:
>> On 7/1/2017 9:12 PM, Timon Gehr wrote:
>>> On 02.07.2017 05:13, Walter Bright wrote:
>>>> On 7/1/2017 3:12 PM, Timon Gehr wrote:
>>>>> const(const(T))     = const(T)
>>>>> const(immutable(T)) = immutable(T)
>>>>> const(inout(T))     = ?
>>>>>
>>>>> It used to be the case that const(inout(T)) = const(T), but this is wrong, 
>>>>> because if we replace 'inout' by 'immutable', the result should be 
>>>>> immutable(T), not const(T). Hence const(inout(T)) cannot be reduced further.
>>>>
>>>> If const(inout(T)) is reduced to inout(T), it works.
>>>
>>> Counterexample:
>>>
>>> const(inout(char))[] foo(bool condition, inout(char)[] chars){
>>>      if(!condition) return "condition failed!";
>>>      return chars;
>>> }
>>>
>>> Turn const(inout(char)) into inout(char) and the example no longer compiles. 
>>> (Nor should it.)
>>
>> I don't think that matters. There's no reason to write const(inout) for a 
>> return value.
> 
> 
> I think the example demonstrate the reason. It either returns the argument or an 
> immutable global. If the argument is immutable, so is the return value, 
> otherwise the return value is const.

The purpose of inout is to transmit the mutable/const/immutable attribute of the 
argument to the return type. If you want the return type to be const, mark it 
const, not const inout.

I can't think of any useful purpose to const inout.

The foo() example is bogus anyway. The return type inout calculus has nothing to 
  do with the return expressions. It's not going to be immutable if the `return 
"condition failed";` is executed. It only depends on the attribute of the 
argument to the `chars` parameter.


More information about the Digitalmars-d mailing list