On 11/05/2012 02:24 AM, Dan wrote:

Thanks. The reason I'm down this path is something like below. I really
want to keep const ref for parms on a method (e.g. foo below). It turns
out the type is a assoc array and length and keys are both giving me a
headache. Without the cast I get a message like:

Error: function acct.Account.__postblit () is not callable using
argument types () const

You probably now this, but this error message indicates that you want to call a non-const method of a const instance.

Below I cast away const (Dohh!). Is it safe in this case?
Casting away const is okay as long as you don't change a single bit of your data.

If not is there another way?

The code below works, too. But to be honest, I don't now why the compiler complains that the postblit is not callable in your version but does not actually get called in mine.

-----
alias Account[string] Map;

struct Account {
      this(this) const { writeln("acct copied"); }
      //this(this) { writeln("acct copied"); }
}

void foo(const ref Map m) {
    pragma(msg, "Map is ", typeof(m));
    pragma(msg, "Map is ", typeof(cast()m));
    writeln("Map has ", m.length);
    writeln("Map has ", m.keys);
}

void main()
{
    Map map;

    Account acct;
    foo(map);
    Account acct2 = acct;
}
-----
I have added the copy construction of acct2 to verify that the const-qualified this(this) is actually used for postblit.

Reply via email to