www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Can't modify this

reply Ary Borenszweig <ary esperanto.org.ar> writes:
This doesn't work:

class Foo {
   this() {
     this = new Foo;
   }
}

Error: Cannot modify 'this'

However you can do this:

class Foo {
   this() {
     auto p = &this;
     *p = new Foo();
   }
}

It even changes the value of this!

Should that compile? I mean, it's the same as modifying 'this'...
Jun 28 2014
next sibling parent reply "H. S. Teoh via Digitalmars-d-learn" <digitalmars-d-learn puremagic.com> writes:
On Sat, Jun 28, 2014 at 05:40:19PM -0300, Ary Borenszweig via
Digitalmars-d-learn wrote:
 This doesn't work:
 
 class Foo {
   this() {
     this = new Foo;
   }
 }
 
 Error: Cannot modify 'this'
 
 However you can do this:
 
 class Foo {
   this() {
     auto p = &this;
     *p = new Foo();
   }
 }
 
 It even changes the value of this!
 
 Should that compile? I mean, it's the same as modifying 'this'...
I'd say, file an enhancement request on the bug tracker. However, there comes a point, where given enough indirections, it would be infeasible for the compiler to figure out exactly where everything points, and so you'll be able to circumvent the compiler check somehow. If you're out to thwart the compiler, then eventually you will succeed, but it begs the question, why? T -- Never wrestle a pig. You both get covered in mud, and the pig likes it.
Jun 28 2014
parent reply Ary Borenszweig <ary esperanto.org.ar> writes:
On 6/28/14, 6:21 PM, H. S. Teoh via Digitalmars-d-learn wrote:
 On Sat, Jun 28, 2014 at 05:40:19PM -0300, Ary Borenszweig via
Digitalmars-d-learn wrote:
 This doesn't work:

 class Foo {
    this() {
      this = new Foo;
    }
 }

 Error: Cannot modify 'this'

 However you can do this:

 class Foo {
    this() {
      auto p = &this;
      *p = new Foo();
    }
 }

 It even changes the value of this!

 Should that compile? I mean, it's the same as modifying 'this'...
I'd say, file an enhancement request on the bug tracker. However, there comes a point, where given enough indirections, it would be infeasible for the compiler to figure out exactly where everything points, and so you'll be able to circumvent the compiler check somehow. If you're out to thwart the compiler, then eventually you will succeed, but it begs the question, why? T
I think that if you disallow taking the address of `this`, then the problem is solved. This is not a big issue (more a curiosity). I just wanted to know what is the correct way to do in this case.
Jun 28 2014
next sibling parent "H. S. Teoh via Digitalmars-d-learn" <digitalmars-d-learn puremagic.com> writes:
On Sat, Jun 28, 2014 at 06:39:33PM -0300, Ary Borenszweig via
Digitalmars-d-learn wrote:
 On 6/28/14, 6:21 PM, H. S. Teoh via Digitalmars-d-learn wrote:
On Sat, Jun 28, 2014 at 05:40:19PM -0300, Ary Borenszweig via
Digitalmars-d-learn wrote:
This doesn't work:

class Foo {
   this() {
     this = new Foo;
   }
}

Error: Cannot modify 'this'

However you can do this:

class Foo {
   this() {
     auto p = &this;
     *p = new Foo();
   }
}

It even changes the value of this!

Should that compile? I mean, it's the same as modifying 'this'...
I'd say, file an enhancement request on the bug tracker. However, there comes a point, where given enough indirections, it would be infeasible for the compiler to figure out exactly where everything points, and so you'll be able to circumvent the compiler check somehow. If you're out to thwart the compiler, then eventually you will succeed, but it begs the question, why? T
I think that if you disallow taking the address of `this`, then the problem is solved. This is not a big issue (more a curiosity). I just wanted to know what is the correct way to do in this case.
That depends on what you're trying to do. Why do you need to assign to this? T -- Three out of two people have difficulties with fractions. -- Dirk Eddelbuettel
Jun 30 2014
prev sibling parent "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> writes:
On Saturday, 28 June 2014 at 21:39:35 UTC, Ary Borenszweig wrote:
 On 6/28/14, 6:21 PM, H. S. Teoh via Digitalmars-d-learn wrote:
 On Sat, Jun 28, 2014 at 05:40:19PM -0300, Ary Borenszweig via 
 Digitalmars-d-learn wrote:
 This doesn't work:

 class Foo {
   this() {
     this = new Foo;
   }
 }

 Error: Cannot modify 'this'

 However you can do this:

 class Foo {
   this() {
     auto p = &this;
     *p = new Foo();
   }
 }

 It even changes the value of this!

 Should that compile? I mean, it's the same as modifying 
 'this'...
I'd say, file an enhancement request on the bug tracker. However, there comes a point, where given enough indirections, it would be infeasible for the compiler to figure out exactly where everything points, and so you'll be able to circumvent the compiler check somehow. If you're out to thwart the compiler, then eventually you will succeed, but it begs the question, why? T
I think that if you disallow taking the address of `this`, then the problem is solved.
IMO it shouldn't be treated differently from other parameters - that's what `this` is, after all.
Jun 30 2014
prev sibling parent "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Saturday, 28 June 2014 at 20:40:21 UTC, Ary Borenszweig wrote:
 This doesn't work:

 class Foo {
   this() {
     this = new Foo;
   }
 }

 Error: Cannot modify 'this'

 However you can do this:

 class Foo {
   this() {
     auto p = &this;
     *p = new Foo();
   }
 }

 It even changes the value of this!

 Should that compile? I mean, it's the same as modifying 
 'this'...
D language was not aimed toward preventing any attepmt to circumvent some hypothetical limitations (it does not even cope with things which it should definetely prevent). There are holes much - much worse. And changing value of this parameter is not a problem anyway, since it is possible to have typeid(this) != typeid of type of current method which is bigger problem than pointing to different value of same type.
Jul 02 2014