News for hackers. Stuff that matters.
Re:C++17 creates a practical use of the backward array index... by TremendousJudge on Monday April 03, 2023 @04:43PM (#35430997)
Half of the new features of "modern" C++ editions leave me agreeing with the change but wondering what they were thinking before. Another example: std::map::contains was introduced in C++20; why did they go decades thinking it wasn't necessary to have such an operator (instead providing only count() even though a map has unique keys), and why did they change their minds only now? Did the old guard literally die off or something?
Re:C++17 creates a practical use of the backward array index... by tubs on Monday April 03, 2023 @05:27PM (#35431519)
Problem with contains is we are now going to see more code like

    if (map.contains(foo)) {
       bob(map[foo]);
    }
over the (vastly uglier) more efficient:

   if (auto it = map.find(foo); it != map.end()) {
       bob(*it);
   }
Of course languages like C# manage this in a more elegant way with out parameters declarable at the call site.
Re:C++17 creates a practical use of the backward array index... by JonChesterfield on Monday April 03, 2023 @05:43PM (#35431717)
A pity the c++ compiler has no way to recognise calls to the c++ library in order to do rewrites like that automatically. It's CSE at the stdlib level, should definitely be possible to do that.
Re:C++17 creates a practical use of the backward array index... by eklitzke on Monday April 03, 2023 @06:38PM (#35432326)
Hard coding behavior like for the STL that seems pretty questionable, especially given that std::map and std::unordered_map have poor performance compared to other alternatives (e.g. absl::btree_map and absl::flat_hash_map, and likewise folly has better implementations).
Re:C++17 creates a practical use of the backward array index... by im3w1l on Monday April 03, 2023 @09:15PM (#35433710)
if let is such a nice way to express this

    if let Some(x) = map.get(foo) {
        bob(x)
    }
One subtle but noteworthy thing is that the idiom only mentions map by name once, which is nice if you have a very long map name, and prevents copy paste bugs where you only update one of the two mentions.
Re:C++17 creates a practical use of the backward array index... by paulddraper on Tuesday April 04, 2023 @12:26AM (#35435068)
Scala:

    for (x <- map.get(foo)) {
      bob(x)
    }

    // or

    map.get(foo).foreach(bob)

    // or

    map.get(foo) match {
      case Some(x) => bob(x)
    }
Re:C++17 creates a practical use of the backward array index... by olliej on Tuesday April 04, 2023 @02:59PM (#35444381)
This pattern exists in C++ as well. The specific issue here is that all these STL APIs are in terms of C++'s iterator model, and can't be replaced with a more modern "optional" style that allows this cleaner coding style :-/
Re:C++17 creates a practical use of the backward array index... by PaulDavisThe1st on Monday April 03, 2023 @05:09PM (#35431327)

  std::map::find (item) != map.end()  <=> std::map::contain (item)
Re:C++17 creates a practical use of the backward array index... by zimpenfish on Tuesday April 04, 2023 @04:05AM (#35436520)
I think the problem is that with `std::map::find(item)` you get the value back but you don't with `std::map::contain(item)` - which means a second lookup to actually retrieve the value, no?
Re:C++17 creates a practical use of the backward array index... by olliej on Monday April 03, 2023 @04:47PM (#35431041)
The historical lack of sequencing is because they were unsequenced in C, and C++ thus inherited it.

And yes, it does seem that there were a lot more people hell bent on resisting correcting unnecessary UB in the past than today, but they’re still around.

Re:C++17 creates a practical use of the backward array index... by TremendousJudge on Monday April 03, 2023 @04:57PM (#35431183)
I get it, but then, why change it now? (or 6 years ago I guess)
Re:C++17 creates a practical use of the backward array index... by olliej on Monday April 03, 2023 @05:02PM (#35431233)
Sorry, I had an unsaved edit above. It seems the resistance to removing unnecessary UB has reduced over the years.