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.