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