It's called "change" and people don't like it.
nullptr is an overkill solution. The ambiguity could have been solved by mandating that NULL be defined as (void*)0 rather than giving implementations the choice of (void*)0 or 0.
Code written by C++ programmers.
Code written to be both C and C++.
>Although it would have been a bit of a pain to adapt,
>an '89 or '99 standard in which the only source representation
>of the null pointer was NULL or nil or some other built-in token
>would have had my approval.
https://groups.google.com/g/comp.std.c/c/fh4xKnWOQuo/m/IAaOe...
(Enumeration constants are the identifiers defined inside enum xxx {...})
If you look at CPPreference you can see how much complexity has been added to the C standard in the last few years.
In fact I don't see anything that needs support anywhere but the actual compiler.
-constexpr is not anything like constexpr in C++. -It makes no guarantees about anything being compile time. -It in no way reflects the ability of the compiler to make something compile time. -It adds implementation burden by forcing the implementations to issue errors that do not reflect any real information. (For instance you may get an error saying your constexpr isnt a constant expression, but if you remove the constexpr qualifier, then the compiler can happily solve it as a constant expression) -All kinds of floating point issues.
We should not have admitted this in to the standard, please do not use.
nullptr is the third definition of null. one should be enough, two was bad. why three?
Got any more information on that? Why does it fail in that way? Is that an implementation or a specification problem?
It fails for 2 reasons:
In order to make it easy to implement it had to be made so limited, that it in no way useful.
The second reason, and the real killer, is the "as if" rule. It states that any implementation can do what ever it wants, as long as the output of the application is the same. This means that how a compiler goes about implementing something is entirely up to the compiler. This means that any expression can be compile or execution time. You can even run the pre-processor at run time if you like! This enables all kinds of optimizations.
In reality, modern compilers like gcc, llvm and MSVC are far better at optimizing than what constexpr permits. However since the specification specifies exactly what can be in a constexpr, the implementations are required to issue an error if a constexpr does something beyond this.
> In order to make it easy to implement it had to be made so limited, that it in no way useful.
Such as?
> The second reason, and the real killer, is the "as if" rule.
Why is that a problem? It sounds like a benefit. It means that the optimization can't break anything, which to me is kind of the point.
Loops, function calls.... things available in C++
>Why is that a problem? It sounds like a benefit. It means that the optimization can't break anything, which to me is kind of the point
As-if is great! but the problem is that constexpr tricks people in to thinking that something is done at compile time, and the as-if rule overrides that and lets the implementation do it when ever it wants. constexpr is a feature over ridden by a fundamental rule of the language.
const int bla = 23;
const int blub[bla] = { 0 };
(see: https://www.godbolt.org/z/hjessMhGK)Isn't this exactly what constexpr is supposed to solve?
Maybe 'const' can't be fixed without breaking existing source code?
I don't really have a problem with adding a new keyword for 'actually const', maybe calling it 'constexpr' means C++ people have wrong expectations though, dunno.
For me, having constexpr being explicit about only accepting actual constant expressions, and creating an error otherwise (instead of silently falling back to a 'runtime expression') is fine, but the existing keyword 'const' has an entirely different meaning, there's just an unfortunate naming collision with other languages where const means 'compile time constant'.
* nullptr: fixes problems with eg, va_arg
* better enums: Who doesn't want that? C is a systems language, dealing with stuff like file formats, no? So why shouldn't it be comfortable to define an enum of the right type?
* constexpr is good, an improvement on the macro hell some projects have
* unprototyped functions removed: FINALLY! That's a glaring source of security issues.
Really I don't see what's there to complain about, all good stuff.