Path: csiph.com!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Tim Rentsch
Newsgroups: comp.lang.c++
Subject: Re: is "x *= ++f * ++f" a valid statement ?
Date: Sun, 11 Aug 2024 06:22:26 -0700
Organization: A noiseless patient Spider
Lines: 68
Message-ID: <8634nbp52l.fsf@linuxsc.com>
References: <96127c8d8d204b7c3230828101bc2b6e@www.novabbs.org> <877cdchj2i.fsf@nosuchdomain.example.com> <86ttgg41yb.fsf@linuxsc.com> <8734nzhjkg.fsf@nosuchdomain.example.com> <87y15rg3wo.fsf@nosuchdomain.example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Date: Sun, 11 Aug 2024 15:22:27 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="e27eccf1f18fd326d4b617bedae077c0"; logging-data="2872327"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18jyXYXntr6W1JWh2yeprTHpr+VcakZOcE="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:v1boFiP4+RY3cgzmXH2VnuPdeLk= sha1:4e6uW5th81QyukzWiTp6r+DlNfM=
Xref: csiph.com comp.lang.c++:119796
Keith Thompson writes:
> Keith Thompson writes:
>
>> Tim Rentsch writes:
>>
>>> Keith Thompson writes:
>>>
>>>> James Kuyper writes:
>>>
>>> [...]
>>>
>>>>> A minor detail is that a variable must be declared, whereas memory
>>>>> locations can, for instance, be part of allocated memory for which
>>>>> no declaration exists - it is still undefined behavior to write
>>>>> code that applies unsequence side-effects to such memory locations.
>>>>
>>>> Digression: I'm not even sure what "variable" means in C++. The
>>>> standard defines the term, but not in a way that really tells us
>>>> what it means.
>>>>
>>>> "A *variable* is introduced by the declaration of a reference other
>>>> than a non-static data member or of an object. The variable's name,
>>>> if any, denotes the reference or object."
>>>
>>> What part do you find confusing or hard to understand?
>>
>> The missing part that should tell us what a variable *is*.
>>
>> It says that certain declarations "introduce" a variable. That's a
>> statement about variables, but it doesn't say what a variable is.
>>
>> Given:
>>
>> int n;
>>
>> we know that the declaration introduces a variable. Is the object
>> itself a "variable"? That's the obvious meaning, and it's consistent
>> with what the standard says. Or is a "variable" some kind of logical
>> binding between an object and a name? That's also consistent with what
>> the standard says. Under the latter interpretation, the "variable" has
>> a name, and that name denotes an object, but the variable is not the
>> object.
>>
>> Given the above declaration, is the introduced variable an object? If
>> so, or if not, how does your answer follow from what the standard says?
[...]
> But the following paragraph says:
>
> A *local entity* is a variable with automatic storage duration
> (6.7.5.4), a structured binding (9.6) whose corresponding variable
> is such an entity, or the *this object (7.5.3).
>
> Storage duration is an attribute of objects. If a variable can have
> automatic storage duration, then apparently a variable is an object.
It seems clear that the quoted sentence is meant to be read as
A *local entity* is a variable [associated with an object that
has] automatic storage duration, [etc].
I'm not sure if C++ references also have storage durations, in which
case the word "object" in that sentence might need to be replaced with
"object or reference". The key point though is that the property of
having automatic storage duration is meant to be associated with the
affiliated object or reference rather than with the variable itself.