Yigal Chripun wrote:
Lars T. Kyllingstad Wrote:

I was going to protest: "But what about const struct members? Should the size of the following struct depend on whether the compiler determines it can optimize by turning its const member into a manifest constant?"

   struct Foo { const int bar = 123; }

But then I decided to actually try it with the current DMD2, and found that the compiler does just that!

   writeln(Foo.sizeof);    // Prints "1", not "4"

   Foo foo;
   auto p = &foo.bar;   // Error: constant 123 is not an lvalue

What's going on? Is this intended behaviour?

-Lars

what D version?

DMD 2.035.


in D1 const is a manifest constant as far as I know.

Yes, but in D2 the spec says that const is a constant view of mutable data. There isn't (or at least I can't find) mention that struct members are excepted from this rule.


to answer to general question, "what about structs": I'd say that the same rules should apply just like inside functions.
struct Foo { const int num = 42; } // num should be a manifest const

can you give a use-case/example where you wouldn't want to do that but rather store the constant in the struct?

In any case where a different view of the same data is non-const. Or would you also disallow casting away const-ness?

-Lars

Reply via email to