Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: constexpr keyword is unnecessary Date: Sat, 19 Oct 2024 14:24:30 -0700 Organization: None to speak of Lines: 54 Message-ID: <8734krrdkh.fsf@nosuchdomain.example.com> References: <877ca5q84u.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Sat, 19 Oct 2024 23:24:30 +0200 (CEST) Injection-Info: dont-email.me; posting-host="4632646bb00bcda06c245f19eb191951"; logging-data="46837"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19zVEnpdnq/hKmewMMa6B58" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:R4HEDjE5RanMdegBWb923bZZLZA= sha1:LB/1M3DELnZPqm5BS+U/XiNgE1Q= Bytes: 3224 David Brown writes: > On 19/10/2024 17:18, Thiago Adams wrote: >> Em 10/18/2024 8:54 PM, Keith Thompson escreveu: >>> Thiago Adams writes: >>>> I think constexpr keyword is unnecessary. >>> >>> Sure, most language features are strictly unnecessary. >>> >>>> Anything you do with it could/should be done with const. >>> >>> No, absolutely not. >>> >> If not, do you have a sample where, using "const" as "constexpr", >> would create problems? >> The sample I know is VLA. >> const int c = 2; >> int a[c]; //a is VLA because c is not a constant expression. >> But this is not enough to convince me because it is better not to be >> a VLA here. >> > > What practical difference would it make? Can you think of any > difference between local variables "a" and "b" defined like this? > > enum { n = 2 }; > const int c = n; > int a[c]; > int b[n]; > > Can you show any situation where you could use "a" and not "b", or > vice versa, or where the meaning would be different? Can you show any > compiler that treats them differently in code generation (assuming a > compiler that supports enough of C99 to allow it)? > > I know of no differences there. That is enough to convince me that it > doesn't matter in the slightest whether it is technically a VLA or > not. VLAs are optional in C11 and later. A conforming implementation that doesn't support VLAs will accept `int b[n];` and reject `int a[c];`. `sizeof a` is not a constant expression, so it can't be used in a case label or any other context that requires a constant expression. (If `const int c = n;` made c a constant expression, this would not apply.) Generated code for constructs that a compiler acccepts is likely to be identical. For a VLA type with a non-constant length, the compiler must implicitly store the size somehow. For a VLA type with a length that the compiler can evaluate at compile time, the compiler is likely to generate code equivalent to that for a non-VLA. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */