this() in struct

Zhenya zheny at list.ru
Tue Oct 9 11:09:56 PDT 2012


On Tuesday, 9 October 2012 at 18:29:18 UTC, Jonathan M Davis 
wrote:
> On Tuesday, October 09, 2012 19:08:35 Zhenya wrote:
>> On Tuesday, 9 October 2012 at 17:21:47 UTC, Zhenya wrote:
>> > Hi!
>> > I'm sorry,maybe this topic already was discussed,but could
>> > anybody explain me
>> > why default constructor was disallowed in structs?
>> 
>> And if I have to do some initialization of data members,what is
>> the way to do it?
>
> It's because of the init property. All types in D are 
> default-initialized to
> their init property, and that property must be known at compile 
> time (meaning
> that it doesn't work very well for it to involve a 
> constructor). For structs,
> the init property is decided by what all of the member 
> variables are directly
> initialized to. So,
>
> struct S
> {
>  int i = 5;
>  string s = "hello";
> }
>
> assert(S.init == S(5, "hello"));
>
> S s;
> assert(s == S.init);
>
> This has the unfortunate result that we don't get a default 
> constructor. The
> workaround is to declare a static opCall function.
>
> struct S
> {
>  int i = 5;
>  string s = "hello";
>
>  static S opCall()
>  {
>  return S(22, "catch");
>  }
> }
>
> S s;
> assert(s == S.init);
>
> S s2 = S();
> auto s3 = S();
> assert(s2 == S(22, "catch"));
> assert(s2 == s3);
>
> It doesn't make it so that the struct is default-initialized to 
> the result of
> static opCall, and it doesn't guarantee that the result of 
> static opCall is
> used when no constructor is called, but if you use S() 
> explicitly, then it
> will be used.
>
> A solid design decision in the language (e.g. requiring that 
> everything be
> default-initialized) can have the unfortunate side effect of 
> restricting other
> choices, and in this case, mucks up default constructors for 
> structs.
>
> - Jonathan M Davis

Ok.Then can I do my own .init property that can be executed in 
compile-time?



More information about the Digitalmars-d-learn mailing list