Issue with const
Steven Schveighoffer
schveiguy at yahoo.com
Mon Apr 9 10:56:30 PDT 2012
On Mon, 09 Apr 2012 13:51:17 -0400, Jacob Carlborg <doob at me.com> wrote:
> On 2012-04-09 17:30, Steven Schveighoffer wrote:
>
>> // untested
>> inout(Foo) clone() inout {
>> return new inout(Foo)(data);
>> }
>>
>> Note, you can't post-assign data, since inout is effectively const
>> inside an inout function.
>>
>> -Steve
>
> Ok, that works. But then I want to modify the clone:
>
> void bar (const Foo foo)
> {
> auto c = foo.clone();
> c.data = ...
> }
>
> But now "c" is const. I don't want "c" to be const, I just want "foo" to
> be const.
Then c.data cannot be the same reference as foo.data.
Counter-case:
void bar( const Foo foo)
{
auto c = foo.clone(); // assume this works;
*(cast(int*)c.data) = 6; // note even though I'm casting, there is no
removal of const, so this should be defined behavior.
}
immutable int i = 5;
const foo = new Foo(&i);
bar(foo);
assert(i == 5); // oops, it's 6!
In that case, you have to clone the data as well.
-Steve
More information about the Digitalmars-d-learn
mailing list