| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
  | 
November 27, 2011 dup method const or not? | ||||
|---|---|---|---|---|
  | ||||
Hi, Recently, I realized that several "dup" methods in D2's phobos are declared like the one for BitArray: @property BitArray dup() My question is why it is declared without "const"? Is it a bug or is there a reason for it? I can think of a case where one only has implemented a shallow copy and wants to omit the const due to the involved transitivity, but this shouldn't be the case for BitArray (the underlying array is dup'ed). Is there a general rule/recommendation when to make a dup method const and when not? My problem arises in a copy constructor for a struct S which takes a const(S) instance. But as S has a BitArray member, duping is not allowed, so I need a way to duplicate a const(BitArray) object. Matthias  | ||||
November 27, 2011 Re: dup method const or not? | ||||
|---|---|---|---|---|
  | ||||
Posted in reply to Matthias Walter  | that's a real good question. it fails with the following error:
Error: function std.bitmanip.BitArray.dup () is not callable using
argument types () const
here is a hack:
---
import std.bitmanip;
import core.stdc.string;
void main()
{
    const(BitArray) foo;
    BitArray bar;
    memcpy(&bar, &foo, BitArray.sizeof);
}
---
 | |||
November 27, 2011 Re: dup method const or not? | ||||
|---|---|---|---|---|
  | ||||
Posted in reply to mta`chrono  | On 2011-11-27 23:48, mta`chrono wrote:
> that's a real good question. it fails with the following error:
> 
> Error: function std.bitmanip.BitArray.dup () is not callable using
> argument types () const
> 
> 
> here is a hack:
> 
> ---
> import std.bitmanip;
> import core.stdc.string;
> 
> void main()
> {
>     const(BitArray) foo;
>     BitArray bar;
> 
>     memcpy(&bar, &foo, BitArray.sizeof);
> }
Well, this hack doesn't even work - as it does a shallow copy only, immediately setting bits of bar also changes bits of foo!
Matthias
 | |||
November 28, 2011 Re: dup method const or not? | ||||
|---|---|---|---|---|
  | ||||
Posted in reply to Matthias Walter  | Okay, what about this hack?
---
import std.bitmanip;
import core.stdc.string;
void main()
{
    const(BitArray) foo;
    BitArray bar;
    bar.len = foo.len;
    bar.ptr = foo.ptr[0 .. foo.dim].dup.ptr;
}
---
 | |||
November 28, 2011 Re: dup method const or not? | ||||
|---|---|---|---|---|
  | ||||
Posted in reply to Matthias Walter  | On Sun, 27 Nov 2011 16:52:56 -0500, Matthias Walter <xammy@xammy.homelinux.net> wrote:
> Hi,
>
> Recently, I realized that several "dup" methods in D2's phobos are
> declared like the one for BitArray:
>
> @property BitArray dup()
>
> My question is why it is declared without "const"? Is it a bug or is
> there a reason for it? I can think of a case where one only has
> implemented a shallow copy and wants to omit the const due to the
> involved transitivity, but this shouldn't be the case for BitArray (the
> underlying array is dup'ed). Is there a general rule/recommendation when
> to make a dup method const and when not? My problem arises in a copy
> constructor for a struct S which takes a const(S) instance. But as S has
> a BitArray member, duping is not allowed, so I need a way to duplicate a
> const(BitArray) object.
dup should be const.  There is no compiler limitation as to why this isn't const.  You should file a bug.
-Steve
 | |||
Copyright © 1999-2021 by the D Language Foundation
 
Permalink
Reply