map kinds of Ranges

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed May 25 10:21:48 PDT 2011


On 5/25/11 12:15 PM, Steven Schveighoffer wrote:
> On Wed, 25 May 2011 12:19:03 -0400, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>
>> On 5/25/11 10:48 AM, Steven Schveighoffer wrote:
>>> On Wed, 25 May 2011 11:45:30 -0400, Don <nospam at nospam.com> wrote:
>>>
>>>> Steven Schveighoffer wrote:
>>>>> On Wed, 25 May 2011 10:59:46 -0400, Don <nospam at nospam.com> wrote:
>>>>>
>>>>>> Robert Clipsham wrote:
>>>>>>> On 24/05/2011 04:28, Jonathan M Davis wrote:
>>>>>>>>> Thoughts on this?
>>>>>>>>
>>>>>>>> I believe that the best and most likely to be implemented syntax
>>>>>>>> which has
>>>>>>>> been suggested (it was Andrei's idea IIRC) is to simply add
>>>>>>>> optional clauses
>>>>>>>> to attributes. So, instead of pure, you'd do pure(condition). If
>>>>>>>> the condition
>>>>>>>> is true, the templated function it's on is pure. If the condition
>>>>>>>> is false,
>>>>>>>> then the function isn't pure. Don't expect pure to become @pure or
>>>>>>>> nothrow to
>>>>>>>> become @nothrow though. I think that at this point, any attribute
>>>>>>>> which is a
>>>>>>>> keyword is going to stay one, and any attribute that has @ on the
>>>>>>>> front of it
>>>>>>>> is going to stay that way as well.
>>>>>>>>
>>>>>>>> - Jonathan M Davis
>>>>>>> Wouldn't it make sense to follow the same syntax as auto ref? auto
>>>>>>> pure, auto nothrow, auto @safe etc? (Although I guess that doesn't
>>>>>>> allow for conditions, nevermind :<)
>>>>>>
>>>>>> 'auto ref' is one of worst syntax anomalies in the language. It
>>>>>> should be a single keyword -- eg, 'autoref' -- it has nothing in
>>>>>> common with the other use of 'auto', and it's not necessarily 'ref'.
>>>>> The current implementation is incorrect. In a correct implementation
>>>>> auto ref *is* always ref.
>>>>> -Steve
>>>>
>>>> You're saying this example from the spec shouldn't compile?
>>>>
>>>> auto ref foo() { return 3; } // value return
>>>
>>> Yes. Auto ref is specifically to allow passing rvalues as references to
>>> functions, not as a template that means either ref or not. At least,
>>> that is my understanding from Andrei's description. I don't have a copy
>>> of TDPL, but I think it's in there too.
>>>
>>> -Steve
>>
>> The example should work. "auto ref" means "ref if possible, otherwise
>> drop it".
>
> Wait, I thought auto ref was to allow rvalues to be passed by reference?
> I.e. given the function:
>
> void foo(auto ref S s)
>
> then you could call foo with an rvalue or an lvalue for s.
>
> I swear every time you have an opinion on auto ref it changes :(
>
> Or are there two different meanings depending on whether auto ref is a
> parameter or return value attribute?
>
> -Steve

The same principle applies to your example: try ref if it works, 
otherwise drop it.


Andrei


More information about the Digitalmars-d mailing list