const challenge

Steven Schveighoffer schveiguy at yahoo.com
Sun Feb 3 07:02:43 PST 2008


"Derek Parnell" wrote
> On Sun, 3 Feb 2008 08:43:54 +0000, Janice Caron wrote:
>
>> On 2/3/08, Derek Parnell wrote:
>>> As far as I can recall, D has always said that
>>> concatenation creates a dynamic array, and since 'const' has been in 
>>> use,
>>> that array is also a mutable one.
>>
>> I don't think that's true. Back in November, Steven Schveighoffer
>> wrote this post:
>> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=61276
>>
>> Stephen was finding he needed to explicitly .dup to get a mutable result.
>
> With respect and meaning no offense, however even though that post of 
> Steven's says...
>
>>> auto a2 = a1 ~ "\n";
>>> Now, a2 is declared as a const(char)[] array,
>
> He has not shown any evidence that that is actually the case. It could
> be that he is assuming that to be the case, because each attempt I have
> made to duplicate his assertion has just shown me that the compiler
> regards 'a2' as mutable.
>
> The current D2 compiler treats 'a2' as mutable.
>

I probably should respond to this :)

D2 at the time did have an issue with a similar statement.  I don't know if 
that's the case now, but it was the basis for my bug report (1654).  What 
triggered me to write the post is that at the time I was attempting to port 
tango to D 2 (I think it was 2.006 or 2.007), and there was a piece of a 
function that attempted to add a string literal to the end of a const or 
mutable char array (can't remember which), and since 2.x has strings as 
invariant, the compiler was complaining.  I was forced to do a dup, or 
needlessly initialize a dynamic array.  I may have misrepresented the exact 
problem, which may have lead to me posting valid code, sorry about that.  I 
thought I had posted the correct thing.

I believe that the return value of any concatenation operation should be 
mutable, as it always creates a new copy.  The issue becomes when you are 
dealing with only invariants, i.e.:

string s = "hello" ~ " world";

Now, if the concatenation operation returned a mutable string, then you need 
an explicit cast.  However I think the problem is being worked on by Walter 
and Andrei.

-Steve 





More information about the Digitalmars-d mailing list