Sujet : Re: ({
De : eesnimi (at) *nospam* osa.pri.ee (Paavo Helde)
Groupes : comp.lang.c++Date : 21. Mar 2025, 11:54:31
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vrjgh8$1bqpn$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
On 20.03.2025 20:27, Alan Mackenzie wrote:
Hello, C++.
I'm having some difficulty (amending Emacs's C++ Mode) reconciling the
two conflicting uses in C++ of ({.
Firstly, it is used as a "statement expression", a GCC enhancement also
found in C, allowing a more relaxed and natural way to write an
expression as the end result of a sequence of statements:
({ int y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })
. I think this usage is very old.
Secondly, there's initialisation expressions like:
void f4 (int a, int b, int c)
{
std::vector<ABC> abcList2(
{{a+6,
b+6,
c+6}
}
);
....
}
. Here the ( on the std::vector line, together with the next {, can be
confused as a statement expression, though it's clearly not meant that
way. I think this syntax is much newer than the other one, though I may
be wrong here.
This braced initialization (called "List-initialization") was introduced in C++11, it is standardized and in wide and growing use.
In calculating the indentation for source lines in these constructs, the
ambiguity causes mis-indentation for one or the other of them.
Now to my question: how common is GCC's statement expression in the wide
world of C++ source code? How much would be lost if I simply removed the
statement expression from C++ Mode's parsing functions?
It appears the statement expressions are a gcc extension which does not even compile in standard C++, and is probably not needed for anything in C++ as there are better options like templated and inlined functions.
In C there might be some usage case for it.
During the last 25 years I do not recall having encountered this feature ever, and I do not even recall anyone bashing it. So I guess it could be ditched pretty easily.