Motive behind !empty() with front() instead of Optional front()
    Andrei Alexandrescu 
    SeeWebsiteForEmail at erdani.org
       
    Thu Apr  8 02:10:55 UTC 2021
    
    
  
On 4/5/21 10:14 PM, Paul Backus wrote:
> On Tuesday, 6 April 2021 at 01:47:47 UTC, Q. Schroll wrote:
>> On Friday, 26 March 2021 at 15:12:04 UTC, Paul Backus wrote:
>>> Of course the ideal would be to make `ref` itself into a type 
>>> qualifier (`ref(T)`).
>>
>> If you look at all the exceptions C++ has for its reference type 
>> constructor, you'll immediately see why Walter created `ref` as a 
>> storage class and not a type constructor. C++ reference types in many 
>> cases don't compose; e.g. `vector<int&>` isn't a thing.
>> If you really think about it, you don't need `ref` as a type 
>> constructor. Although allowing `ref` local variables wouldn't be 
>> harmful, I guess.
> 
> Here's what the generic identity function currently looks like in D:
> 
>     auto ref T identity(T)(auto ref T arg)
>     {
>         import core.lifetime: forward;
>         return forward!arg;
>     }
> 
> Here's what the generic identity function *would* look like if `ref` 
> were a type qualifier:
> 
>     T identity(T)(T arg)
>     {
>         return arg;
>     }
I'm not so sure. Complications arise when you pass an lvalue to identity 
- is it to be considered of type T or ref T? There are pros and cons to 
each, which is why C++ chose to allow both; its unprecedented 
decltype(auto) was defined especially to be part of function return type 
when it is to transport refness out.
Same class of problems have caused other anomalies in C++, such as 
decltype(identifier) and decltype((identifier)) having different types.
The case is open and hot.
    
    
More information about the Digitalmars-d
mailing list