...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

const/invariant member function

なにげに const メンバ関数が追加されてる?
それと invariant メンバ関数なるものも.

class A
{
private:
    int value;
    int mutableMember()             {   value = 1;   return value; }
    const int constMember()         { /+value = 1;+/ return value; }
    invariant int invariantMember() { /+value = 1;+/ return value; }
    
public:
    void foo() // mutable member
    {
        auto x = mutableMember();
        auto y = constMember();
        //auto z = invariantMember(); // error, mutable member can not call invariant member
    }
    const void bar() // const member
    {
        //auto x = mutableMember(); // error, const member can not call mutable member
        auto y = constMember();
        //auto z = invariantMember(); // error, const member con not call invariant member
    }
    invariant void boo() // invariant member
    {
        //auto x = mutableMember(); // error, invariant member can not call mutable member
        auto y = constMember();
        auto z = invariantMember();
    }
}

void main()
{
    A a = new A;
    a.foo();
    a.bar();
    //a.boo(); // error, mutable object 'a' can not call invariant member 'boo'
    
    const(A) ca = cast(const)a;
    //ca.foo(); // error, const object 'ca' can not call mutable member 'foo'
    ca.bar();
    //ca.boo(); // error, const object 'ca' can not call invariant member 'foo'
    
    invariant(A) ia = cast(invariant)a;
    //ia.foo(); // error, invariant object 'ia' can not call mutable member 'foo'
    ia.bar();
    ia.boo();
}

こ・・・これは・・・!?
すげー複雑!
あってるのかな?w


とにかく const メンバ関数C++ と同じような挙動をするみたい.
ただ,invariant メンバ関数が絡むとよくわからなないなあ.
なんで;

となるんだろう?