digitalmars.D.bugs - BUG: Constructor chaining and const member intialization
- Garett Bass (57/57) Jan 17 2006 The code sample below highlights three related issues with constructor c...
- Garett Bass (50/50) Jan 19 2006 Update: Removed an erroneous comment from Foo.this(float f).
- Thomas Kuehne (13/15) Jan 31 2006 -----BEGIN PGP SIGNED MESSAGE-----
The code sample below highlights three related issues with constructor chaining under the current DMD version: 1. BUG: chaining constructors is not a recognized means of initializing const fields. 2. ANNOYANCE: chaining constructors allows multiple initialization of const fields. 3. ANNOYANCE: constructors allow explicit multiple initialization of const fields. The work around is to discard constructor chaining in classes requiring dynamic initialization of const members. This requires the const member initialization code to be duplicated in each constructor, C++ style, which is error prone and produces inelegant code and maintainability issues. This is a problem (not a show stopper) for a library I'm currently implementing. The extra workaround code significantly reduces the readability of the sample implementation. Regards, Garett ------------ module test; private import std.stdio; class Foo { class Bar { this() { writefln(" Bar.this()"); } } const auto Bar bar; this() { bar = new Bar; writefln(" Foo.this()"); } /* 1. This constructor prompts a compiler error this(int i) { // missing initializer for const field bar this(); writefln(" Foo.this(%d)", i); } */ // 2. This constructor initializes "const" bar twice this(float f) { // missing initializer for const field bar this(); bar = new Bar; writefln(" Foo.this(%0.1f)", f); } // 3. Thie constructor explicitly initializes "const" bar more than once this(char[] s) { this(); bar = new Bar; bar = new Bar; // Should this be an error? writefln(" Foo.this(%s)", s); } } void main() { writefln("f..."); auto Foo f = new Foo(2.f); writefln("g..."); auto Foo g = new Foo("3.0"); } ------------ output: f... Bar.this() Foo.this() Bar.this() Foo.this(2.0) g... Bar.this() Foo.this() Bar.this() Bar.this() Foo.this(3.0)
Jan 17 2006
Update: Removed an erroneous comment from Foo.this(float f). ------------ module test; private import std.stdio; class Foo { class Bar { this() { writefln(" Bar.this()"); } } const auto Bar bar; this() { bar = new Bar; writefln(" Foo.this()"); } /* 1. This constructor prompts a compiler error this(int i) { // missing initializer for const field bar this(); writefln(" Foo.this(%d)", i); } */ // 2. This constructor initializes "const" bar twice this(float f) { this(); bar = new Bar; writefln(" Foo.this(%0.1f)", f); } // 3. Thie constructor explicitly initializes "const" bar more than once this(char[] s) { this(); bar = new Bar; bar = new Bar; // Should this be an error? writefln(" Foo.this(%s)", s); } } void main() { writefln("f..."); auto Foo f = new Foo(2.f); writefln("g..."); auto Foo g = new Foo("3.0"); } ------------ output: f... Bar.this() Foo.this() Bar.this() Foo.this(2.0) g... Bar.this() Foo.this() Bar.this() Bar.this() Foo.this(3.0)
Jan 19 2006
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Garett Bass schrieb am 2006-01-18:The code sample below highlights three related issues with constructor chaining under the current DMD version: 1. BUG: chaining constructors is not a recognized means of initializing const fields.[snip] Added to DStress as http://dstress.kuehne.cn/run/c/const_29_A.d http://dstress.kuehne.cn/run/c/const_29_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFD3zoU3w+/yD4P9tIRApBfAJ9/2ybTJfWe+cxU7QTLT/IfYQCqOQCdG4hF qMkfel+dqmiz1sMwnDn1WJw= =KEJZ -----END PGP SIGNATURE-----
Jan 31 2006