Path: ...!feeds.phibee-telecom.net!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: David Brown Newsgroups: comp.lang.c Subject: Re: C23 auto x C++ auto. Date: Sun, 26 May 2024 18:10:32 +0200 Organization: A noiseless patient Spider Lines: 63 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sun, 26 May 2024 18:10:33 +0200 (CEST) Injection-Info: dont-email.me; posting-host="75f63f5864dc091ec43360d736bfcccd"; logging-data="3653282"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+0F84eNScpy8Q9jzI4Wa4w7ZTKJD1NKJU=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:hROb3rItk8m4xlLpLjv3h7fzebE= Content-Language: en-GB In-Reply-To: Bytes: 3022 On 26/05/2024 16:22, Bonita Montero wrote: > Am 26.05.2024 um 15:49 schrieb Thiago Adams: >> I think most people is not aware of this: >> >>  From 3096 C23 draft >> >> " >> 6.7.9 Type inference >> ... >>   2 For such a declaration that is the definition of an object the >> init-    declarator shall have the form >> >>     direct-declarator = assignment-expression >> " >> >> Basically "direct-declarator" differs from "declarator" because it >> does not contains pointer. >> >> Then the type inference using auto and pointer is something undefined >> in C23. >> >> struct node{ >>      struct node * next; >> >> }; >> int main(){ >>     struct node node = {}; >>     auto * p = node.next; >> } >> >> :7:4: error: 'auto' requires a plain identifier, possibly with >> attributes, as declarator >>      7 |    auto * p = node.next; >>        |    ^~~~ >> >> This differs from C++. >> >> > > I don't know what type inference in C is good for since the type names > in C are usually short. If I have short typenames in C++ I don't use > type inference. Type-inference makes sense to make such things shorter >     typename map::const_iterator it = map.cbegin(); > This doesn't happen in C. > "typeof" and "auto" have been available forever as gcc extensions (where "auto" was spelt "__auto_type", since of course "auto" had another meaning in C until C23). One use-case for C is in macros that handle multiple types, but I expect people have done other things with them too. It would have been nice to see statement expressions included in C23, as they have been in gcc for ages: #define max(a,b) \ ({ __auto_type _a = (a); \ __auto_type _b = (b); \ _a > _b ? _a : _b; }) In general, it's just another tool that could be useful in writing code that's a bit more flexible.