On Thursday, 24 January 2019 at 17:49:34 UTC, Ali Çehreli wrote:
On 01/24/2019 04:35 AM, FeepingCreature wrote:
> On Tuesday, 27 March 2018 at 12:31:05 UTC, Simen Kjærås wrote:
>> On Tuesday, 27 March 2018 at 12:17:58 UTC, Ellie Harper
wrote:
>>> Sorry if this is a stupid question, but is there something
special
>>> required to call Appender.clear?  When I attempt even just
a simple
>>> use I am getting compile errors relating to `template
object.clear`.
>>
>> From the documentation for Appender:
>>
>>> Note
>>> clear is disabled for immutable or const element types, due
to the
>>> possibility that Appender might overwrite immutable data.
>>
>> Since string is immutable(char)[], clear() is simply not
available for
>> appender!string.
>>
>> --
>>   Simen
>
> Isn't this wrong, though? Appender controls the memory it
references. It
> could just choose to allocate non-immutable memory
internally. As long
> as any const data put into the appender is *returned* as
const, there is
> no chance of immutable memory being overwritten.

I think Appender is trying to protect previous data from Appender's later use. If it handed out immutable data, the user is expecting it to not change. So, Appender cannot clear it for later use.

Ali

Aren't the semantics of .clear that it's invalid to access references to .data after calling .clear, period? And if not, then shouldn't they be? Consider if Appender managed its own memory and held on to previously-allocated arrays while you were appending, only to free them on .clear. That seems like something Appender should be allowed to do. If you don't want it, just reinitialize Appender instead of calling .clear.

Appender is sometimes given a starting array. clear isn't callable in that case, and we don't distinguish the difference in the type or at runtime.

Any reason that the semantics of .clear should be different for a starting array? Anyway if so, I'd prefer to just make that a runtime error.

I'm mostly fishing around if anyone has an objection to a PR to change this.

Reply via email to