sameProblemSameSolution
70 comments · 98% upvoted · source · other discussions
70 comments · 98% upvoted · source · other discussions
Basically what I told someone a couple days ago.
John Businessman in his business formal wear at Legacy Inc. will never switch away from C++98 anyway.
Dude i migrated a massive project from c++17 to c++26 in like 15 minutes i dont get the drama
As someone responsible for these upgrades on a large project: - MSVC just announced they fully support C++23 in the . 52 compiler - It isn't just switching the version, it's also switching the compiler version - This comes with upgrade of related tooling (upgrade clang and clang-format and clang-tidy and clangd ...) - It also comes with upgrading the used OS (Ubuntu 22.04 -> 26.04) - Sometimes you see ICE (internal compiler error) popping up - Some breaking changes require work to resolve (like operator== in C++20) - Even if you no technical issues, you need to find the time while features have priority - You need material to 'teach' all employees
My experience: switching the version flag is the easy part
Thank you, I've never had an internal compiler error and now will have nightmares about that for weeks.
We have a file logging library (zlog) with thousands of calls. We're not switching to std::format. Even after they fix it so it can do all the printf stuff. Just checking an LLM translation would break whoever got that job.
We're slowly moving to std::ranges::for_each/all_of/etc but that's not a migration so much as a progression when we change code that uses older versions.
There's a whole bunch of similar stuff, we mostly try to avoid having too much clang-tidy whining.
For 17 specifically, autoptrs
And there is me who is just glad that C++98 is over.
C++03 -> 11 migration was a pain in the ass because of std::string changes, but after that it was basically just changing compiler flags, no?
There are some minor things, if you are unlucky something might break going to 20. But it's mostly special cases, not something so big as string.
The main reason companies don't switch is "it's working, why invest time and money into switching?"
Undefined / implementation defined behavior or regular stuff?
Depends on the companies. Tech giants would be losing potential employees if they stuck with outdated standards, and that loss outweighs costs of upgrades.
Airlines and finance both employ a lot more than “tech giants”.
The real cost is the testing and compliance.
Any change needs to be documented and tested.
At the end of the day it’s a financial decision.
Security updates, more and potentially better frameworks, more efficiency,... dont know about c++ but the things the java team added since 8... boy, the reduced server costs will pay for themselves pretty fast
I thought the entire reason why C++ is so convoluted is because it keeps everything around for backwards compatibility.
Some things do get deprecated and removed like std::auto_ptr. The ABI compatibility was broken for std::string between 03 and 11.
And turning on all the new warnings and hints and clang-tidy updates and cpp-check checks and other fun stuff. Wherein you learn that sometimes passing a std::string to printf "works" because of SSO, and it's worked in prod for ages.
For Microsoft they dropped support for some stuff with newer versions. Which was outside of the standard so fair enough but can break projects.
Like references in unions.
The <=> operator was a big pain point. Many of our tests started failing with weird bugs
How? Pre-c++20 codebase won't even have them.
I honestly don't remember the details or the compiler version. I think the error was because some of our types only partly conformed to ideas of sorting, and that caused some weird interaction where some types in a vector didn't want to test for just ">=" but some other things as well, which we didn't need so didn't implement. Neither "==" nor ">" were there for our types.
The solution was to use more spaceship operators. The error message was clean but we didn't really know how <=> worked yet, so it delayed us a week or so.
Ehm... Standard algorithms and data structures use operator < though, even for equivalence.
If neither == nor > are there, how did your types end in a test that expects ordered-like behavior for your types?
Oh, the exposed type did, not the inner type
DIS = Draft International Standard
Just in case anyone else was wondering.
Honestly some of the newer shit doesn't even look like C++ to me anymore. IE:
constexpr auto my_meta_type = int; // Reflected metadata of 'int' [:my_meta_type:] my_variable = 42; // Splicing it back into code; compiles as: int my_variable = 42;
The code generation / reflection stuff is amazing.
Historically, when you'd need type information (without manually defining it), you'd have to add an extra compilation step where a custom tool either manually searches the codebase or interrogates a compiler API, now, you can just write compile-time code in your codebase that automagically populates a data structure for you with any type information you could desire.
It'll be really useful for my (hobby) game engine, where I was previously considering traversing the Clang AST
If you look at what engines currently use for reflection (ugly macros mostly), this can be a huge improvement if the engine can be rewritten with this in mind.
But the sad part is I can only see maybe UE going with it with the next major release because they can force this kind of change, but open source stuff is never getting it most likely, way too much inertia.
if(auto foo = call_some_function([parameters](const auto &thing){
return test_the_thing(thing)
}; foo == enum_type::operation_success) {
there's code here;
}
That's perfectly valid and readable C++ and I won't hear otherwise.
(I am using std::optional a lot now that it kinda works. It's not a Rust Result but it's near enough for Australia)
I love C++ because it's an un-opinionated, multi paradigm language where you can do whatever you want but that shit is horrendous. Freedom was a mistake.
I am glad you can code how you like, but corona virus social distancing protocols are in effect
You get used to it, and if you expand the above back into C-style code it turns into an utter abomination. Especially with code where you need to write "if any of these, find a matching one of those" type sequences, and {hopefully soon... serialise it to JSON and send it}
Fundamentally C++ is limited by its roots, which is why Rust people are so unbearable {changes hats} about the utter perfection of the language.
Hard disagree.
True C is readable, but kinda annoying it has to bring in pointers.
Edit, realized I bungled the test_the_thing. Fuck it IDK, coding on mobile sucks
``` Int test_the_thing (*blah blah, args){ Return blah; } Void func(){ Blah result; If(test_the_thing(&result, args) ){ Do stuff; }
}
```
Cpp pass by reference makes it pretty sweet and simple for ez cases.
``` Int test_the_thing (&blah blah, args){ Return blah; } Void func(){ Blah result; If(test_the_thing(result, args) ){ Do stuff; }
}
```
The return result by argument pattern is a little eeeh, but it makes sense considering that's often how it has to work under the hood anyway. Optionals are syntactic sugar alternative for the same semantics.
``` Std::optional<blah> test_the_thing ( args){ Return args.blah; } Void func(){ Blah result=(test_the_thing( args); If(result ){ Do stuff; }
}
```
I can see why each incremental change is made and how it leads to what you like. E.g. yeah the two part of statement is kinda nice for this simple case. But the end result is pretty bad imo.
To me, it's like those overly clever nested ternary statements, but worse. Super fun to write, echnically a couple characters more concise, but so tangled together that reading it is miserable.
Defining and constructing an anonymous class in an if statements conditional is just way too much going on there for simple shit, and way way too much going on for complex shit!
But the beauty of c++ is that's just like my opinion sis and you can do you <3
In Australia everything wants to kill you, even C++ code?
if(errno){🔥}
I just hate that you can't have an optional reference, and it breaks my templates occasionally and I have to go look up how to actually do template metaprogramming.
Excited for 26 though, I believe they've filled that gap.
It seems valid but would the first “if”not always be true due to the single “=“ ?
No, it’s an assignment, and this code tests the value that was assigned. So basically “foo = …; if (foo)”
Yep, the shiny new if-two-statements, upgraded from the old if-statement. It's surprisingly convenient, partly because I used to get frustrated at not being able to explicitly test "if(auto foo=some_random_shit))" and I loathe implicit "nullptr is 0 and also false"
I eagerly std::await the even more improved if-three-statements-and-a-loop "operator" 🔥
Can't you do if ((auto foo = bar()) == baz) {barf()}; //?
Nope, that's not allowed. The previous standard let you say "if(auto foo = something)" and if foo could be interpreted as a boolean you had a valid if() statement. The new one lets you have two statements, the auto assign and the test.
The win here is the scoped auto variable, FWIW. If avoids the abominable pattern where you either alternate declaration/conditional, or a pile of declarations then a string of tests, mixing assignments in whatever way is least horrible. So you get a chain of declare-assign-test statements in a nice vertical line rather than a >
the compile time reflection is incredible. only zig and jai have something that can really match it in power, and they're significantly simpler languages.
Far too aggressive of a standardization schedule for a supposedly stable language. The signal-to-noise ratio is also getting worse between versions.
I felt very fancy when I upgraded to C99 from ANSI C a couple of years ago
We've migrated to c++20 and thinking of 23, but it was insane 2.5 year act. Build system rewrite(and ~12 merged prs in cmake) was required to make it cleaner but now it works for ios, win, mac, linux, android.
During 2012-2016, I was so excited and ambitious to learn and use C++ profesionally. Later on when its' standardization becoming more and more ridiculous, it does more damage to me rather on making things easier.
C++ 20 (and the following streamlining of C++ 23) was a monumental upgrade in making it easier to use and avoiding foot guns without having to always write your own standard library, what are you even talking about?
when its' standardization becoming more and more ridiculous
Literally all that was added over the years following C++11 are optional features. No one holds a gun to your head forcing you to use them.
If those optional features where implementing sensible things, sure. For example, can you, using the standard library, print vector<vector<int>> to stdout easily? As far as I can tell, no, you need to write loops or recursion yourself.
Is that really such a pressing issue? Regardless, reflection makes that way easier on the library side.
Almost like as if there is no one single correct way to print out such structure. If you always want to print it out the same way then no one stops you from writing your own mini library to do it in your every project. Go back to Python if you want the language to hold your hand and decide stuff for you.
Eh, debug printing is definitely an overlooked feature in C++. It’s possible that reflection will improve things somewhat, but hard to say
I believe std::format can already do that?
This is why I find it so frustrating. Yes, std::format is the exact kind of construct you would expect to solve this problem. However it does not work with any collection out of the box.
We tried to make it work but ended up making a recursive templated function instead. Now, I guess everyone can make their own recursive templating function, but then why do we even gave std::format
*cries in Java8\*
worthlessDreamer 109 points · 1d ago
At least we got lambdas right 🥹
laplongejr 40 points · 1d ago
10 years ago, I was writing their first Java8 software.
Now I'm working on updating it to Java 17 servers... oh wait they are speaking of maaaaaybe going for Java 21
Sarmq 1 points · 16m ago
We'll end up in Valhalla before we get to Valhalla
RussianMadMan 41 points · 1d ago
c++11 still gets a lot of usage, its like the c++ version of java 8.
OppositeFun2493 7 points · 1d ago
Reminds me of something I was watching that had captions that said "[yawns in Spanish]"
how do you yawn in Spanish
just_looking_aroun 20 points · 1d ago · :cs:
Maybe “yawñ”?