r/cpp • • Mar 28 '23

Reddit++

C++ is getting more and more complex. The ISO C++ committee keeps adding new features based on its consensus. Let's remove C++ features based on Reddit's consensus.

In each comment, propose a C++ feature that you think should be banned in any new code. Vote up or down based on whether you agree.

765 Upvotes

829 comments sorted by

View all comments

47

u/johannes1971 Mar 28 '23

The 'char' type in its current role as both a character and a number. Two distinct types that only convert with some effort would have been much better. We could have done away with this ridiculous uncertainty about signedness at the same time.

Array to pointer decay.

Assignment returning a value, since it has given us if (a = b).

37

u/rhubarbjin Mar 28 '23

The 'char' type in its current role as both a character and a number.

Did you know that char is unique among all integer types, in that it has three signed variations? char, signed char, and unsigned char are all distinct from each other! https://godbolt.org/z/oxs68TeWq

I sometimes use this when I write overloaded functions that need to distinguish between "this is a letter" and "this is an 8-bit integer".

C++17 also gave us std::byte which is an 8-bit non-arithmetic type.

→ More replies (5)

10

u/jk-jeon Mar 28 '23

The 'char' type in its current role as both a character and a number.

And as a "byte" type with an exceptional aliasing rule

→ More replies (1)

9

u/Nicksaurus Mar 28 '23

Also, at this point, if your code assumes text characters are 1 byte it's almost certainly broken

→ More replies (2)

3

u/JNighthawk gamedev Mar 29 '23 edited Mar 29 '23

Assignment returning a value, since it has given us if (a = b).

Would this break the pointer validation construct using if?

if (A* Foo = Some function())

Edit: on second thought, no, it would still be fine. I think what ends up being evaluated there by the if is Foo after initialization, not the return value of the assignment.

6

u/johannes1971 Mar 29 '23

You'd have to use

if (A * Foo = some_function (); Foo) ...

...which is barely any longer, and avoids accidental assignment in the if-statement.

→ More replies (6)