Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <vrmpft$a537$1@dont-email.me>
Deutsch   English   Français   Italiano  
<vrmpft$a537$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: David Brown <david.brown@hesbynett.no>
Newsgroups: comp.lang.c++
Subject: Re: ({
Date: Sat, 22 Mar 2025 17:45:49 +0100
Organization: A noiseless patient Spider
Lines: 51
Message-ID: <vrmpft$a537$1@dont-email.me>
References: <vrhmme$8v0$1@news.muc.de> <vrjgh8$1bqpn$1@dont-email.me>
 <vrm4rl$2ue$1@news.muc.de> <vrmkd2$67va$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Sat, 22 Mar 2025 17:45:49 +0100 (CET)
Injection-Info: dont-email.me; posting-host="7638945e773161e15f919c68c89e04e1";
	logging-data="332903"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/O/66eeOny9T7Jh7U4PtEGgDLVM7dqqJg="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:hJUntKKf0Ws9Kle2s0YPJiqoP2c=
In-Reply-To: <vrmkd2$67va$1@dont-email.me>
Content-Language: en-GB
Bytes: 3406

On 22/03/2025 16:18, Paavo Helde wrote:
> On 22.03.2025 12:53, Alan Mackenzie wrote:
>> Paavo Helde <eesnimi@osa.pri.ee> wrote:
>>> 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.
>>
>> I'm not sure what you meant by templated functions here, but an inline
>> function has the disadvantage of fragmenting the code.  Rather than have
>> a few lines of code where they're used, you need to look somewhere else
>> to see what they do.
> 
> At the GCC page for statement expressions they say "This feature is 
> especially useful in making macro definitions “safe” (so that they 
> evaluate each operand exactly once)" and most of their examples are 
> about macros.
> 
> A macro is fragmenting the code exactly in the same way as an inline 
> function, except the macros are worse than functions in multiple ways. 
> In C one might argue macros are needed for supporting multiple types at 
> the same time, but in C++ this is solved much better by function templates.
> 
> Ergo, a C-style macro using statement expressions can easily replaced 
> with a more regular and better behaving function or function template in 
> C++, with no increase in code "fragmentation".
> 
> For "in-place" use Bonita is right a lambda can be used to the same 
> effect, but the readability probably does not go better. As per the 
> first example on the GCC page (poor man implementation of abs()):
> 
> int a = ({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; });
> 

It can also combine well with type inference, such as the example from 
GCC's reference:

#define max(a, b) \
	({ __auto_type _a = (a); __auto_type _b = (b); \
	  _a > _b ? _a : _b; })

(In C23, "auto" is approximately equivalent to "auto" in C++, so you 
don't need the gcc "__auto_type" extension any more.)

Of course such function-like macros are usually best replaced with 
template functions in C++.  I can't think off-hand of a situation where 
statement expressions in C++ would be significantly better than either 
an inline function / function template, or an immediately-invoked lambda.