[HN Gopher] C++20 Ranges Algorithms - 7 Non-Modifying Operations
       ___________________________________________________________________
        
       C++20 Ranges Algorithms - 7 Non-Modifying Operations
        
       Author : ibobev
       Score  : 43 points
       Date   : 2022-04-25 16:58 UTC (6 hours ago)
        
 (HTM) web link (www.cppstories.com)
 (TXT) w3m dump (www.cppstories.com)
        
       | pavon wrote:
       | This is nice short-hand that I've wanted for a while. I do wish
       | they would have made them overloads of the existing functions in
       | the same namespace, rather than in a new ranges namespace. Oh
       | well, you can always use that namespace, and even if you don't
       | "::ranges" is still less typing than "begin(), end()".
        
         | beojan wrote:
         | You can always do something like
         | 
         | namespace rng = std::ranges;
        
       | curiousgal wrote:
       | I'd be curiously to see how many people actually use modern C++
       | professionally. I've always been under the impression that
       | adoption of the standard lags behind by like 7 years or so.
        
         | pavlov wrote:
         | I wrote C++ at Facebook last year and got to use C++20 features
         | like ranges.
         | 
         | It wasn't my call, though. Meta has a relatively big C++ infra
         | team that participates in the standards committee, maintains
         | the Folly utility library, and decides how complex new features
         | like coroutines are adopted. On top of that, my code plugged
         | into another team's system, and they had written their own
         | guidelines on how/if they want to use specific C++ and Folly
         | features.
         | 
         | These guardrails were really useful for a C fossil like me with
         | an on-off relationship to C++... It's not a terrible language
         | anymore, but it's even harder than before to find the right
         | subset. At least boost can be finally buried.
        
         | duped wrote:
         | The last time I used C++20 features (modules) I caused a
         | segfault in GCC. This was in December, iirc it was GCC 11.
        
           | pjmlp wrote:
           | Right now VC++ is the only viable option for C++20 modules,
           | and even it isn't without warts.
        
             | tialaramex wrote:
             | It is kind of crazy that JTC1 is OK with producing entirely
             | imaginary documents. Do you think the two standards bodies
             | _know_ that the product of WG21 is just pieces of paper
             | with no idea whether they can be or will be implemented? Or
             | is this all far above what anybody senior at ISO or the IEC
             | understands because they aren 't programmers?
             | 
             | Even at W3C you were expected (when I had anything to do
             | with it) to actually build the prototype before you publish
             | the standard, and obviously the IETF's "Rough Consensus and
             | Running Code" speaks to that way of thinking too.
             | 
             | I feel like if ISO 216 claimed you can fold a _square_ 1x1
             | metre piece of paper in half and preserve the proportions,
             | that wouldn 't have survived into a published document.
             | Sure you can _write_ that claim, but you cannot actually
             | make that fold, it 's surely amazing that the C++ Committee
             | are not subject to the same consideration and yet here we
             | are.
        
               | mhh__ wrote:
               | They do reject things based on implementation difficulty
               | too. "Static if considered" rejects it on the basis that
               | the implementations would struggle.
        
               | Kranar wrote:
               | Not really, it had nothing to do with implementation
               | difficulty and the paper actually states that
               | implementing static if would be fairly easy:
               | 
               | http://www.open-
               | std.org/jtc1/sc22/wg21/docs/papers/2013/n361...
               | 
               | What the paper says is that static if would make it much
               | harder to perform static analysis of source code, not
               | really because it's hard to implement but because the
               | kind of combinatorial explosion introduced by having non-
               | local bifurcating source code branches to analyze makes
               | analysis incredibly slow.
               | 
               | C++ did eventually adopt if constexpr, which does not
               | have this problem since the branches are always local.
        
               | mhh__ wrote:
               | if constexpr is the static if we have at home. It's
               | rubbish.
        
               | pjmlp wrote:
               | On the contrary, what is happening is the hard reality of
               | MIT based compilers when downstream doesn't care about
               | improving upstream language compliance.
               | 
               | clang is trailing C++20, since Apple and Google stop
               | caring to be first line contributors.
               | 
               | GCC is actually not that far behind VC++.
               | 
               | And regarding building prototypes, VC++ modules
               | implementation was the prototype.
        
         | gotaquestion wrote:
         | I see a lot of it in the academic AI world, mostly because as
         | students move from Python (study) to real-world deployments,
         | they need to convert to C++ for performance. Hence, over the
         | past decade I've seen C++ start to look more like a
         | transliteration of Python, and be used that way.
         | 
         | The fact that TensorFlow on Python can use GPUs/TPUs is a no-
         | brainer, but that only works in the server center and not in
         | the field.
        
         | jcelerier wrote:
         | I generally start using -std=c++XX switches in compilers before
         | the standards are actually released ; I don't remember the last
         | time I've seen a project that wasn't at least c++17
        
           | wyldfire wrote:
           | LLVM itself has only just now green-lit using c++17 [1] so I
           | find myself using c++14 most of the time.
           | 
           | [1] https://discourse.llvm.org/t/important-new-toolchain-
           | require...
        
             | jcelerier wrote:
             | You are seriously missing out. C++17 has worked fine for
             | years with clang - and I wouldn't ever go back to writing
             | sfinae code since c++20 concepts are there, it's a massive
             | simplification; likewise for structured bindings (for(auto&
             | [k,v] : map)), if constexpr, ...
        
         | GuB-42 wrote:
         | That's about right in my case. 2019 was more or less the years
         | we switched to C++11. Some projects started using C++11 way
         | earlier, and we still have some code we keep C++98, so, 8
         | years.
         | 
         | Anyways, I don't know what you are calling "modern" C++, but
         | for me it is C++11 and up. C++11 to C++20 introduced a few
         | major changes but none as pervasive as C++98 to C++11.
        
         | veilrap wrote:
         | My company does a decent job at keeping up with the standard.
         | Getting from C++11 to C++14 was challenging, and C++14 to C++17
         | took quite a bit of time, but we're on track to be on C++20
         | later this year.
        
           | rubyist5eva wrote:
           | Do you have a strategy for doing this? Since C++ stays
           | relatively backwards compatible I would imagine there is lots
           | of legacy code that gets untouched but newer features would
           | go into the new stuff - with legacy code getting replaced
           | only for big refactorings?
        
             | veilrap wrote:
             | Our code tends to be shipped running on top of a relatively
             | up-to-date version of linux. So we tend to go through the
             | pain of testing/refactoring needed to get to the next
             | version of C++ when we upgrade to the next stable version
             | of linux that we're going to support.
        
         | psyclobe wrote:
         | I've shipped two projects wholly in c++20 in the past 4 years
         | with modern practices spanning three platforms (win/Lin/OSX).
         | 
         | No plans to go back to an older standard.
        
           | Kranar wrote:
           | What does "wholly in C++20" mean? How does "wholly in C++20"
           | differ from "partially in C++20" or just "using C++20"?
        
         | advael wrote:
         | I have a habit of modernizing (and functionalizing) C++
         | codebases in recent jobs I've taken, which tends to fix a lot
         | of memory-related bugs as well as improving performance and
         | readability. When an organization is hidebound in some way,
         | someone has to push to make the change, but it definitely can
         | happen if you can demonstrate the benefits
        
         | latenightcoding wrote:
         | that sounds about right, 5 years ago I was pleasantly surprised
         | when large existing C++ code bases were C++11, now it's very
         | common.
        
         | 29athrowaway wrote:
         | Low level languages give you fine control over memory
         | management.
         | 
         | But many companies do not like how the standard library does
         | memory management and they roll their own allocators and
         | libraries that use them.
        
         | Espressosaurus wrote:
         | I've been using C++17 since 2019; C++11 since 2013, and we're
         | starting to scope out upgrading our toolchain to C++20.
         | 
         | Depending on where you work at, my experience suggests 2-5
         | years for adoption.
        
         | fassssst wrote:
         | Windows uses it extensively for both user land system code and
         | the app platform.
        
         | jahnu wrote:
         | All c++20 here and just waiting for Clang and ultimately Xcode
         | to catch up with MSVC so we can use ranges and pmr
        
           | thraneh wrote:
           | range-v3 is a great library allowing you to bridge the gap:
           | https://github.com/ericniebler/range-v3
        
         | [deleted]
        
       | cosmiccatnap wrote:
       | I like c++ but it feels maddening to learn. There was a time when
       | I would tell people to learn C++ but now I tell them to start
       | with C and work their way up because if the choice is between C
       | and C++, C has become the more readable language somehow if you
       | don't know what abstract classes, templates, and functional
       | constructs are....even a bubble sort in C++ takes some explaining
       | in terms of just the syntax sugar.
       | 
       | GO and rust are great languages and I hope they go the distance
       | and learn some of the lessons from C and especially C++
        
         | codr7 wrote:
         | These days it makes more sense to start from the other end if
         | you ask me, and that has been true for quite a while.
         | 
         | I find that my C++ style has drifted further and further into
         | value land with time, which is a major difference to C where
         | the same style is pretty much impossible to pull off.
         | 
         | From one perspective, the language gets less and less complex;
         | but the flip side is that all the old stuff is still in there
         | and has the potential to cause a lot of trouble if you're not
         | familiar with the details.
         | 
         | Taken as a whole, it's pretty much an impossible language to
         | master and has been for some time.
        
         | swatcoder wrote:
         | Even as a polyglot that picks up new languages quickly and
         | often, I think this is true of most actively maintained major
         | languages now.
         | 
         | We're in an age where major languages are expected to cross-
         | pollinate: if there's a cool paradigm or technique in some
         | other major language, how do we evolve our language to support
         | it?
         | 
         | That's not a terrible thing in itself, but it means that most
         | major languages are multi-paradigm now and become more so every
         | release.
         | 
         | As a consequence, learning becomes less straightforward.
         | 
         | C may feel like a nice starter to you specifically because it's
         | been comparatively resistant to this trend. It's got a ton of
         | tricks to learn, but there are only a few paths through
         | learning it.
        
           | gotaquestion wrote:
           | C takes on many dialects based on specialization. Compare
           | code from the following, and you will see a range from
           | trivial to understand to WTF. These are all real-world
           | applications:
           | 
           | - Linux kernel (events) - https://github.com/torvalds/linux/b
           | lob/master/kernel/events/...
           | 
           | - Arm CMSIS - (16-bit math) - https://github.com/ARM-
           | software/CMSIS_5/blob/develop/CMSIS/D...
           | 
           | - Numerical Methods in C - (Jacobian FP) -
           | https://github.com/saulwiggin/Numerical-Recipies-
           | in-C/blob/m...
           | 
           | - GNU 'ls' Command -
           | https://github.com/coreutils/coreutils/blob/master/src/ls.c
           | 
           | - Gstreamer - (De-facto media streaming) - https://github.com
           | /GStreamer/gstreamer/blob/master/gst/gstel...
           | 
           | GStreamer is my favorite because it basically creates VTables
           | like C++ but calls them Klasses (based on Gnome), and it is
           | just a brilliant framework in general, but an utter
           | perversion of C IMHO.
        
             | [deleted]
        
             | mrlonglong wrote:
             | The Linux kernel does the same thing as Gstreamer with file
             | operations etc, I r thought it pretty neat, not really a
             | perversion at all.
        
           | pjmlp wrote:
           | Even with C it only looks like it, if one sticks mainly with
           | a specific compiler and OS.
        
         | inetknght wrote:
         | > _There was a time when I would tell people to learn C++ but
         | now I tell them to start with C and work their way up_
         | 
         | I tell people to learn Python. When they get a hang of it then
         | I introduce them to C and pointers. When they can demonstrate
         | effective use of pointers without blowing up then advance to
         | C++. If not then just keep using Python. I'd rather them learn
         | computer science fundamentals on the easy language. Then they
         | can learn the better language out of necessity ("i need more
         | performance" or "i need more control over the data structure in
         | memory" or similar) instead of shoehorning them into a language
         | they're not ready for.
         | 
         | I love C++. But it's not for everyone.
        
         | tialaramex wrote:
         | If what you need is C++ (which IMNSHO it is not) then starting
         | with C is a bad idea. Here's Kate Gregory's talk, you should
         | definitely listen to her even if you think I'm an idiot because
         | she actually teaches people C++ and I (thankfully) do not.
         | 
         | https://www.youtube.com/watch?v=YnWhqhNdYyk
         | 
         | Now here's my rant, which is unrelated to Kate's very smart
         | talk:
         | 
         | C has an excuse, because it was written in the 1970s for the
         | PDP-11. In the 1970s _struct_ qualifies as a fancy new feature.
         | In the 1970s a _wide pointer_ is very expensive. In the 1970s a
         | _linked list_ is often a good choice of data structure. C++
         | comes along quite a lot later. These things are already untrue
         | or fast becoming untrue, but rather than risk being _unpopular_
         | Bjarne 's language just cargo cults C. It is almost all of C,
         | plus more... stuff.
         | 
         | C++ does not fix any of the worst problems with C, because
         | doing so would risk losing compatibility and hurt Bjarne's
         | adoption story. As a result, with only a handful of exceptions
         | _all of that broken garbage is still there_. C++ still has the
         | almost useless built-in array type from C, it keeps weird
         | syntax from C that was too hard to ban in the 1970s compiler
         | but you should never use, its built-in types have the same
         | stupid, confusing names like  "long" and "double", it has this
         | awful "macro pre-processor" which makes even trivial tooling
         | problems very difficult and set back software quality by at
         | least a decade.
         | 
         | Kate's approach _avoids_ teaching beginners about most of this.
         | It 's still there, which is bad, but at least you aren't making
         | them learn about it, only to them immediately tell them it's
         | forbidden knowledge and is prohibited in your nice modern C++
         | codebase. Instead of starting with raw pointers, and then
         | trying to impress upon them later that these are a bad idea,
         | Kate gets to begin with references and then a smart owning
         | pointer.
        
           | pjmlp wrote:
           | Struct was already a feature in Jovial in 1958, but I
           | digress.
           | 
           | Plenty of very hard 1970's features at Bell Labs, weren't a
           | problem at IBM, DEC, Xerox, Olivetti,....
           | 
           | As for the way C compatibility taints C++, I agree, however
           | Bjarne made juice with the lemons he had, and if it is to do
           | a Python 3 in the C++ world, then most would rather migrate
           | to Rust than use such C incompatible C++.
        
             | annowiki wrote:
             | Why wouldn't they just use the older version of C++? If you
             | don't want non-c compatible c++ you could just stick to
             | C++20 instead of upgrading to "C++breaking_changes".
             | 
             | I ask because its not like support will ever be phased out
             | like Python 2.
        
               | pjmlp wrote:
               | A language isn't used alone, it depends on an ecosystem,
               | and people that care to keep old compilers going.
        
       ___________________________________________________________________
       (page generated 2022-04-25 23:01 UTC)