dmd 2.063 beta 5
Don
turnyourkidsintocash at nospam.com
Fri May 24 04:57:51 PDT 2013
On Friday, 24 May 2013 at 10:55:09 UTC, Artur Skawina wrote:
> On 05/24/13 02:33, Steven Schveighoffer wrote:
>> On Thu, 23 May 2013 19:03:25 -0400, Artur Skawina
>> <art.08.09 at gmail.com> wrote:
>>
>>> On 05/23/13 23:06, Steven Schveighoffer wrote:
>>
>>>> compiles:
>>>>
>>>> struct S
>>>> {
>>>> const int x;
>>>> this(int n)
>>>> {
>>>> x = n;
>>>> }
>>>> }
>>>
>>> It's the 'const int x = 42;' case we're talking about. *That*
>>> one does not
>>> compile and doesn't need to. It /could/, but I see no reason
>>> to allow this;
>>
>> My example is essentially:
>>
>> const int x = 0;
No, that's not the same.
const int w;
is the same syntax used in C++. It's a declaration without an
initializer. It signals your intention to initialize it later.
Now, D does default-initialize everything, so that there really
isn't any such thing as an uninitialized variable in D, but it
still signals the intention that you will modify it later.
int is a misleading example since the default initializer is 0,
and it's common for people to rely on that.
Better to use char or float, or a class, where the default
initializer is not usable, and it's clearer that it's a bug to
use it.
The only way I can understand this feature is that it is changing
the meaning of initializers inside aggregates.
Previously, they were initializers. Now, they're not. They're
setting the value of .init for the class.
And they use the same syntax which is used for actual
initializers.
In the past, the compiler didn't check if you from set a field in
a constructor, which you had already initialized with an
initializer.
But, it didn't really matter.
With a const field, it makes a much bigger difference, since if
an initializer was specified, the only way that the field can
make sense is if you modify it somewhere else. So the initializer
MUST be able to be overwritten.
This has lead us to this oddity that under the new regime,
const char c = 'e';
is setting the value of c, unless it is inside an aggregate, in
which case it's not initializing c, it's just specifying what
.init is for that struct.
So, it's overloading the syntax to mean two very different things.
---
> Hence, you are arguing for a change in behavior. And the
> arguments for that
> are extremely weak. The goal should be to allow const
> initialization to happen
> exactly once.
I agree. This is the crux of the argument.
Are you and I the the only ones who see that as a valuable
property of the language? I'm astonished that others are so
willing to sacrifice it.
More information about the Digitalmars-d-announce
mailing list