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