const behaviour

Ali Çehreli acehreli at yahoo.com
Fri Jun 22 15:45:15 PDT 2012


On 06/22/2012 02:21 AM, Namespace wrote:
 > Based to the current const discussions (once again) I wanted to appease
 > my curiosity and want to ask why the following code works as described
 > in the comments:
 >
 > [code]
 >
 > import std.stdio;
 >
 > class Bar { }
 >
 > class Foo {
 > private:
 > string _text;

_text is a reference to immutable(char).

 >
 > Bar _b;

_b is a reference to mutable Bar.

 >
 > public:
 > this(string text, Bar b) {
 > this._text = text;
 > this._b = b;
 > }
 >
 > // const_behaviour.d(18): Error: cannot implicitly convert expression
 > (this._b) of type const(Bar) to const_behaviour.Bar
 > Bar GetB() const pure nothrow {

That function promises that the object will not be modified through it.

 >  /// <- must be const(Bar) instead of Bar

That is not entirely correct. The return type need not be const(Bar). 
The problem is with what you are returning.

 > return this._b;

That is the problem. To enforce its no-mutation guarantee, the function 
cannot return a non-const reference to the Bar object that _b is a 
reference of. The return type Bar compiles with this code:

     Bar GetB() const pure nothrow {
         return new Bar();
     }

 > }
 >
 > string GetText() const pure nothrow { /// <- no const(string) is
 > neccessary. Why?

Because _text is a non-mutating reference.

 > return this._text;
 > }
 > }
 >
 > void main() {
 > Bar b = new Bar();
 >
 > Foo f = new Foo("foobar", b);
 > }
 >
 > [/code]

Note that the caller can modify the string that GetText() returns by 
e.g. appending to it:

     string t = f.GetText();

t is a copy of _text. They currently share the same characters: "foobar".

     t ~= "zar";

The act of appending does not change _text in any way. It still refers 
to "foobar".

Ali

-- 
D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html



More information about the Digitalmars-d-learn mailing list