Decision on container design

Steven Schveighoffer schveiguy at yahoo.com
Tue Feb 1 12:05:37 PST 2011


On Tue, 01 Feb 2011 14:26:26 -0500, Simon Buerger <krox at gmx.net> wrote:

> On 01.02.2011 18:08, Steven Schveighoffer wrote:

>> swap isn't the problem.
>>
>> foreach(s; myVectorSet)
>> {
>> // if s is by value, it must be copied for each iteration in the loop
>> }
>
> Just to note: the "correct" solution for the last problem is
>
> foreach(const ref s; myVectorSet)
>
> which is working in current D. In a more value-based language you may  
> even want to default to "const ref" for foreach-loop-values, and even  
> for function-parameters. I suggested that a while ago, but wasn't liked  
> much for D, for good reasons.

This is not a "solution".  I cannot enforce that someone uses foreach with  
ref semantics.  Unless the type is a reference type, like a class.

Note that const ref isn't necessarily want, you could want to mutate the  
elements of the vector, meaning you really want ref.

The whole point is, it's too easy to get it wrong, and the wrong thing  
looks innocuous and does not look like it will perform horribly.

Compare this to someone who actually *wants* value semantics when  
iterating a reference type (which should be very rare):

foreach(s; myVectorSet)
{
    auto setIAmGoingToUse = s.dup; // clear intentions: "yes, I want to do  
an expensive copy"
}

-Steve


More information about the Digitalmars-d mailing list