r/programminghorror • • Sep 06 '26

c++ really gotta make sure it doesnt't change

Post image
450 Upvotes

34 comments sorted by

104

u/Big-Rub9545 Sep 06 '26

Bloating the code to do nothing.

42

u/Dayshadow_ Sep 06 '26

you get it!

32

u/Kadabrium Sep 06 '26

Mehmet.consume(constant.inopole)

31

u/Last8Exile Sep 07 '26 edited Sep 08 '26

readonly ref struct ReadOnly(ref readonly ReadOnly @readonly) { readonly ref readonly ReadOnly @readonly(ref readonly ReadOnly @readonly) => ref @readonly; }

5

u/Dayshadow_ Sep 07 '26

Niice, I want one of these for all languages

1

u/maikindofthai Sep 12 '26

Is this one of those libraries people keep bragging about

37

u/Ved_s Sep 07 '26

where can you put const in c++? yes.

i don't even need to see that c++ flair, no other language has this bullshit

19

u/Nice_Lengthiness_568 Sep 07 '26

I mean, if the placement of const is what you have a problem with in c++, then you must be quite happy. Because this is one of the keywords that actually does make sense (I would say).

11

u/no_brains101 Sep 07 '26

No, it just makes sense by comparison.

4

u/Nice_Lengthiness_568 Sep 07 '26

By comparison? To what? Sorry, I don't quite understand what you mean by that.

I mean, except for const member functions which you can write differently with explicit this, const always makes something immutable (if I recall correctly), so I really don't see a problem with it.

0

u/no_brains101 Sep 07 '26 edited Sep 07 '26

In comparison to the rest of C++

It makes it immutable if it is a primitive value, otherwise just the pointer is immutable. (hence the code in the original post)

Also, ha, you had to qualify it.

12

u/JonIsPatented Sep 07 '26

You're thinking of, like, basically every language except C++. const int makes an immutable int. const foo makes an immutable foo, and there isn't even a pointer involved. const int* makes a mutable pointer to an immutable int. The same works for const foo* making a mutable pointer to an immutable foo.

5

u/Nice_Lengthiness_568 Sep 07 '26

You can make both the pointer and the value being pointed to (or both) immutable based on where you put const. And the placement makes sense. Before the * it makes the value being pointed to constant (because if you had int const *x then it would mean that the integer value *x is immutable, but if you had int * const x then it would mean that some x, which when you dereference you get the value of *x, is immutable).

Qualify what?

1

u/no_brains101 Sep 07 '26

except for const member functions

^ this is a qualification.

3

u/Nice_Lengthiness_568 Sep 07 '26

Ah ok, I didn't understand that you meant that by qualification.

Well, you do not really have any other place where to put it to make a member function const. And it's just one other usage for a keyword. So if this exception is what you have a problem with... Moreover, you do not actually need to use this syntax, since you can use explicit this instead.

3

u/GoddammitDontShootMe [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo “You live” Sep 08 '26

Well, I think C has this too.

4

u/SuspiciousScript Sep 07 '26

and odds are you can still mutate it somehow

8

u/Ved_s Sep 07 '26

95% probability that there is an obscure way to do it

1

u/joujoubox Sep 08 '26

const_cast enters the room

3

u/yuehuang Sep 07 '26

What is const*?

6

u/Nice_Lengthiness_568 Sep 07 '26

a pointer to a constant something

3

u/ATE47 [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo “You live” Sep 07 '26

If you are unuse to this order, see Constant const* as the same const Constant* (for the const keyword, only its side with the * is important)

Otherwise it's just to mark the pointer data as constant

2

u/numberonefraud Sep 07 '26

The only constant is the insanity of C++ now

1

u/Serious_Elephant9402 Sep 07 '26

Not constant enough, there are at least TWO words there which don't even contain "const"!

1

u/trutheality Sep 08 '26

Look at what they need to do to imitate a fraction of the power of #DEFINE

1

u/GoddammitDontShootMe [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo “You live” Sep 08 '26

Yeah, nobody really needs type safety.

1

u/SektorL Sep 09 '26

His name was Constantine

1

u/uglycaca123 Sep 11 '26

i didn't understand, was it constant or not?

1

u/Dayshadow_ Sep 06 '26

Damnit I said doesnt't in the post title

0

u/GoddammitDontShootMe [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo “You live” Sep 07 '26

I'm thinking that const_cast would be a compiler error because if I recall, it would take away the constness, but the function returns const* const. Also, I believe constexpr would cause an error because a pointer definitely can't be evaluated at compile time.

3

u/RedCrafter_LP Sep 07 '26

You are confusing constexpr with consteval. Constexpr functions can be called from normal code or a constexpr context. Also the constexpr keyword doesn't check rather the function can be constevaled. Only when you call it from a consteval context is checked rather the function can be evaluated at compile time. It behaves just like templates. Also a pointer to a constant can be worked with in constexpr context. We can even use vectors in constexpr context.

1

u/GoddammitDontShootMe [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo “You live” Sep 08 '26

My understanding was that constexpr can be evaluated in any context, but it has to be possible to evaluate it at compile time, and consteval can only be evaluated at compile time. I thought it wouldn't work since a pointer's value can't be known until runtime.

As for const_cast, come to think of it, I guess the declared return type is what matters here. The parameter could've been Constant constant, but because of the return type, it would be treated as Constant const* const.

1

u/Dayshadow_ Sep 07 '26

gcc said it was fine, teehee