<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://guillaumedua.github.io/publications/feed.xml" rel="self" type="application/atom+xml" /><link href="https://guillaumedua.github.io/publications/" rel="alternate" type="text/html" /><updated>2026-03-21T07:56:22+00:00</updated><id>https://guillaumedua.github.io/publications/feed.xml</id><title type="html">Guillaume Dua</title><subtitle>A blog about C++, software-design and project-management.
</subtitle><author><name>guillaumedua</name></author><entry><title type="html">Trip Report - Meeting Cpp 2025</title><link href="https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report/" rel="alternate" type="text/html" title="Trip Report - Meeting Cpp 2025" /><published>2026-03-13T00:00:00+00:00</published><updated>2026-03-13T00:00:00+00:00</updated><id>https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report</id><content type="html" xml:base="https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report/"><![CDATA[<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/meeting-cpp-2025-tshirt-logo.jpg" alt="Meeting Cpp 2025 - logo" /></p>

<!--more-->

<table>
  <thead>
    <tr>
      <th> </th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Event</td>
      <td><a href="https://meetingcpp.com/2025/">Meeting C++ Conference, 2025</a></td>
    </tr>
    <tr>
      <td>Author</td>
      <td>Guillaume Dua</td>
    </tr>
    <tr>
      <td>Date</td>
      <td>11/06/2025 - 11/08/2025</td>
    </tr>
    <tr>
      <td>My attendance sponsor</td>
      <td><a href="https://www.fairmat.tech/">Fairmat</a></td>
    </tr>
    <tr>
      <td>Revision</td>
      <td>R1</td>
    </tr>
  </tbody>
</table>

<hr />

<ul id="markdown-toc">
  <li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
  <li><a href="#-11062025" id="markdown-toc--11062025">📅 11/06/2025</a>    <ul>
      <li><a href="#️jens-weller-welcome-message" id="markdown-toc-️jens-weller-welcome-message">🗣️<strong>Jens Weller</strong>: Welcome Message</a>        <ul>
          <li><a href="#sponsors" id="markdown-toc-sponsors">Sponsors</a></li>
          <li><a href="#creating-a-safe-and-inclusive-environment" id="markdown-toc-creating-a-safe-and-inclusive-environment">Creating a <strong>safe</strong> and <strong>inclusive</strong> environment</a></li>
          <li><a href="#in-memory-of-rainer-grimm" id="markdown-toc-in-memory-of-rainer-grimm">In memory of Rainer Grimm</a></li>
        </ul>
      </li>
      <li><a href="#️anthony-williams-software-and-safety-opening-keynote" id="markdown-toc-️anthony-williams-software-and-safety-opening-keynote">🗣️<strong>Anthony Williams</strong>: Software and safety (Opening Keynote)</a>        <ul>
          <li><a href="#what-safety-means-" id="markdown-toc-what-safety-means-">What safety means ?</a></li>
          <li><a href="#standards-and-mindset" id="markdown-toc-standards-and-mindset">Standards and mindset</a></li>
          <li><a href="#why-systems-fail-" id="markdown-toc-why-systems-fail-">Why systems fail ?</a></li>
          <li><a href="#undefined-behaviors-ub-and-reliability" id="markdown-toc-undefined-behaviors-ub-and-reliability">Undefined behaviors (UB) and reliability</a></li>
          <li><a href="#contracts-in-c26-as-a-safety-leverage" id="markdown-toc-contracts-in-c26-as-a-safety-leverage">Contracts in C++26 as a safety leverage</a></li>
          <li><a href="#defense-in-depth-using-appropriate-strategy-and-tools" id="markdown-toc-defense-in-depth-using-appropriate-strategy-and-tools">Defense in depth, using appropriate strategy and tools</a></li>
          <li><a href="#the-arene-base-library" id="markdown-toc-the-arene-base-library">The Arene Base library</a></li>
          <li><a href="#my-takeaway" id="markdown-toc-my-takeaway">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️sebastian-theophil-to-err-is-human-robust-error-handling-in-c26" id="markdown-toc-️sebastian-theophil-to-err-is-human-robust-error-handling-in-c26">🗣️<strong>Sebastian Theophil</strong>: To Err is Human: Robust Error Handling in C++26</a>        <ul>
          <li><a href="#the-landscape-of-error-handling-historical-perspective" id="markdown-toc-the-landscape-of-error-handling-historical-perspective">The landscape of error handling: historical perspective</a></li>
          <li><a href="#the-modern-stuffs-stdexpected" id="markdown-toc-the-modern-stuffs-stdexpected">The modern stuffs: std::expected</a></li>
          <li><a href="#the-modern-stuffs-contracts" id="markdown-toc-the-modern-stuffs-contracts">The modern stuffs: contracts</a></li>
          <li><a href="#library-hardening-in-c26" id="markdown-toc-library-hardening-in-c26">Library hardening in C++26</a></li>
          <li><a href="#practical-rules-for-real-world-code" id="markdown-toc-practical-rules-for-real-world-code">Practical rules for real-world code</a></li>
          <li><a href="#about-thinkcells-error-reporting" id="markdown-toc-about-thinkcells-error-reporting">About <code class="language-plaintext highlighter-rouge">ThinkCell</code>’s error reporting</a></li>
          <li><a href="#my-takeaway-1" id="markdown-toc-my-takeaway-1">My takeaway</a></li>
          <li><a href="#additional-resources-learn-more-about-error-handling" id="markdown-toc-additional-resources-learn-more-about-error-handling">Additional resources: learn more about error handling</a></li>
        </ul>
      </li>
      <li><a href="#️nicolai-josuttis-using-stdgenerator-in-practice" id="markdown-toc-️nicolai-josuttis-using-stdgenerator-in-practice">🗣️<strong>Nicolai Josuttis</strong>: Using <code class="language-plaintext highlighter-rouge">std::generator&lt;&gt;</code> in Practice</a>        <ul>
          <li><a href="#what-coroutines-are-and-arent" id="markdown-toc-what-coroutines-are-and-arent">What coroutines are (and aren’t)</a></li>
          <li><a href="#what-stdgenerator-brings" id="markdown-toc-what-stdgenerator-brings">What std::generator brings</a></li>
          <li><a href="#pitfalls-and-caveats" id="markdown-toc-pitfalls-and-caveats">Pitfalls and caveats</a></li>
          <li><a href="#my-takeaway-2" id="markdown-toc-my-takeaway-2">My takeaway</a></li>
          <li><a href="#additional-resources-learn-more-about-coroutines" id="markdown-toc-additional-resources-learn-more-about-coroutines">Additional resources: learn more about coroutines</a></li>
        </ul>
      </li>
      <li><a href="#️sandor-dargo-code-reviews-building-better-code-and-stronger-teams" id="markdown-toc-️sandor-dargo-code-reviews-building-better-code-and-stronger-teams">🗣️<strong>Sandor Dargo</strong>: Code Reviews: Building Better Code and Stronger Teams</a>        <ul>
          <li><a href="#the-value-of-code-reviews" id="markdown-toc-the-value-of-code-reviews">The value of code reviews</a></li>
          <li><a href="#common-arguments-and-misconceptions" id="markdown-toc-common-arguments-and-misconceptions">Common arguments and misconceptions</a></li>
          <li><a href="#the-human-aspects" id="markdown-toc-the-human-aspects">The human aspects</a></li>
          <li><a href="#sandors-air-methodology" id="markdown-toc-sandors-air-methodology">Sandor’s <strong>AIR</strong> methodology</a></li>
          <li><a href="#my-takeaway-3" id="markdown-toc-my-takeaway-3">My takeaway</a>            <ul>
              <li><a href="#bonus-how-i-personally-do-code-reviews" id="markdown-toc-bonus-how-i-personally-do-code-reviews">Bonus: How I personally do code reviews</a></li>
            </ul>
          </li>
          <li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
        </ul>
      </li>
      <li><a href="#️anders-schau-knatten-the-two-memory-models" id="markdown-toc-️anders-schau-knatten-the-two-memory-models">🗣️<strong>Anders Schau Knatten</strong> The Two Memory Models</a>        <ul>
          <li><a href="#what-are-the-two-memory-models-" id="markdown-toc-what-are-the-two-memory-models-">What are the two memory models ?</a></li>
          <li><a href="#at-language-level" id="markdown-toc-at-language-level">At language-level</a></li>
          <li><a href="#at-cpu-level" id="markdown-toc-at-cpu-level">At CPU-level</a></li>
          <li><a href="#mental-model-for-developers" id="markdown-toc-mental-model-for-developers">Mental model for developers</a></li>
          <li><a href="#my-takeaway-4" id="markdown-toc-my-takeaway-4">My takeaway</a></li>
          <li><a href="#additional-resources" id="markdown-toc-additional-resources">Additional resources</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#-11072025" id="markdown-toc--11072025">📅 11/07/2025</a>    <ul>
      <li><a href="#️jens-weller---good-morning-meeting-c" id="markdown-toc-️jens-weller---good-morning-meeting-c">🗣️<strong>Jens Weller</strong> - Good Morning Meeting C++</a>        <ul>
          <li><a href="#my-takeaway-5" id="markdown-toc-my-takeaway-5">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-frances-buontempo---center-keynote---stoopid-questions" id="markdown-toc-️-frances-buontempo---center-keynote---stoopid-questions">🗣️ <strong>Frances Buontempo</strong> - Center Keynote - Stoopid Questions</a>        <ul>
          <li><a href="#my-takeaway-6" id="markdown-toc-my-takeaway-6">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-jonathan-müller---cache-friendly-c" id="markdown-toc-️-jonathan-müller---cache-friendly-c">🗣️ <strong>Jonathan Müller</strong> - Cache-Friendly C++</a>        <ul>
          <li><a href="#cache-friendly-code-why-does-it-matter-" id="markdown-toc-cache-friendly-code-why-does-it-matter-">Cache-friendly code: why does it matter ?</a></li>
          <li><a href="#data-structures-matter" id="markdown-toc-data-structures-matter">Data structures matter</a></li>
          <li><a href="#type-size-and-layout-affect-cache-use" id="markdown-toc-type-size-and-layout-affect-cache-use">Type size and layout affect cache use</a></li>
          <li><a href="#prefetching--cache-lines" id="markdown-toc-prefetching--cache-lines">Prefetching &amp; cache lines</a></li>
          <li><a href="#code-is-data-too" id="markdown-toc-code-is-data-too">Code is data too</a></li>
          <li><a href="#data-oriented-design-dod" id="markdown-toc-data-oriented-design-dod">Data-Oriented Design (DOD)</a></li>
          <li><a href="#multicore-pitfalls" id="markdown-toc-multicore-pitfalls">Multicore pitfalls</a></li>
          <li><a href="#my-takeaway-7" id="markdown-toc-my-takeaway-7">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-andreas-fertig---embedded-friendly-c-features-that-make-a-difference" id="markdown-toc-️-andreas-fertig---embedded-friendly-c-features-that-make-a-difference">🗣️ <strong>Andreas Fertig</strong> - Embedded-Friendly C++: Features That Make a Difference</a>        <ul>
          <li><a href="#content" id="markdown-toc-content">Content</a></li>
          <li><a href="#my-takeaway-8" id="markdown-toc-my-takeaway-8">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-daniela-engert---towards-safety-and-security-in-c26" id="markdown-toc-️-daniela-engert---towards-safety-and-security-in-c26">🗣️ <strong>Daniela Engert</strong> - Towards Safety and Security in C++26</a>        <ul>
          <li><a href="#content-1" id="markdown-toc-content-1">Content</a></li>
          <li><a href="#my-takeaway-9" id="markdown-toc-my-takeaway-9">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-raymi-klingers---25-years-of-pathfinding-problems-with-c" id="markdown-toc-️-raymi-klingers---25-years-of-pathfinding-problems-with-c">🗣️ <strong>Raymi Klingers</strong> - 25+ Years of pathfinding problems with C++</a>        <ul>
          <li><a href="#content-2" id="markdown-toc-content-2">Content</a></li>
          <li><a href="#my-takeaway-10" id="markdown-toc-my-takeaway-10">My takeaway</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#-11082025" id="markdown-toc--11082025">📅 11/08/2025</a>    <ul>
      <li><a href="#️-klaus-iglberger---the-real-problem-of-c" id="markdown-toc-️-klaus-iglberger---the-real-problem-of-c">🗣️ <strong>Klaus Iglberger</strong> - The Real Problem of C++</a>        <ul>
          <li><a href="#safety-vs-performance-an-historical-tradeoff" id="markdown-toc-safety-vs-performance-an-historical-tradeoff">Safety vs. performance: an historical tradeoff</a></li>
          <li><a href="#bounds-safety" id="markdown-toc-bounds-safety">Bounds safety</a></li>
          <li><a href="#undefined-behaviors-the-silent-killers" id="markdown-toc-undefined-behaviors-the-silent-killers">Undefined behaviors: the silent killers</a></li>
          <li><a href="#type-safety-through-strong-types" id="markdown-toc-type-safety-through-strong-types">Type safety through strong types</a></li>
          <li><a href="#lifetime-safety-value-semantics-over-inheritance" id="markdown-toc-lifetime-safety-value-semantics-over-inheritance">Lifetime safety: value semantics over inheritance</a></li>
          <li><a href="#conclusion-the-real-problem-is-a-people-problem" id="markdown-toc-conclusion-the-real-problem-is-a-people-problem">Conclusion: the real problem is a <strong>people problem</strong></a></li>
          <li><a href="#my-takeaway-11" id="markdown-toc-my-takeaway-11">My takeaway</a></li>
          <li><a href="#additional-sources" id="markdown-toc-additional-sources">Additional sources</a></li>
        </ul>
      </li>
      <li><a href="#️-roth-michaels---how-to-become-obsolete-a-guide-to-software-engineering-mentorship" id="markdown-toc-️-roth-michaels---how-to-become-obsolete-a-guide-to-software-engineering-mentorship">🗣️ <strong>Roth Michaels</strong> - How to become obsolete: a guide to software engineering mentorship</a>        <ul>
          <li><a href="#why-become-obsolete-" id="markdown-toc-why-become-obsolete-">Why become obsolete ?</a></li>
          <li><a href="#shared-technical-leadership" id="markdown-toc-shared-technical-leadership">Shared technical leadership</a></li>
          <li><a href="#identifying-and-developing-leaders" id="markdown-toc-identifying-and-developing-leaders">Identifying and developing leaders</a></li>
          <li><a href="#practical-mentorship-techniques" id="markdown-toc-practical-mentorship-techniques">Practical mentorship techniques</a>            <ul>
              <li><a href="#sharing-knowledge" id="markdown-toc-sharing-knowledge">Sharing knowledge</a></li>
              <li><a href="#talking-through-engineering-problems-asking-them" id="markdown-toc-talking-through-engineering-problems-asking-them">Talking through engineering problems, asking them</a></li>
              <li><a href="#pair-debugging-is-an-incredibly-powerful-teaching-tool" id="markdown-toc-pair-debugging-is-an-incredibly-powerful-teaching-tool">Pair-debugging is an incredibly powerful teaching tool</a></li>
              <li><a href="#code-reviews-differenciate-types-of-comments" id="markdown-toc-code-reviews-differenciate-types-of-comments">Code-reviews: differenciate types of comments</a></li>
              <li><a href="#encourage-psychological-safety" id="markdown-toc-encourage-psychological-safety">Encourage psychological safety</a></li>
            </ul>
          </li>
          <li><a href="#qa" id="markdown-toc-qa">Q&amp;A</a></li>
          <li><a href="#my-takeaway-12" id="markdown-toc-my-takeaway-12">My Takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-kerstin-keller---why-managing-c-dependencies-is-hard-and-what-to-do-about-it" id="markdown-toc-️-kerstin-keller---why-managing-c-dependencies-is-hard-and-what-to-do-about-it">🗣️ <strong>Kerstin Keller</strong> - Why managing C++ dependencies is hard (and what to do about it)</a>        <ul>
          <li><a href="#what-are-dependencies--what-is-dependency-management-" id="markdown-toc-what-are-dependencies--what-is-dependency-management-">What are dependencies &amp; what is <strong>dependency management</strong> ?</a></li>
          <li><a href="#how-developers-handle-dependencies-nowadays-" id="markdown-toc-how-developers-handle-dependencies-nowadays-">How developers handle dependencies nowadays ?</a></li>
          <li><a href="#why-c-dependencies-management-is-unique-and-hard-" id="markdown-toc-why-c-dependencies-management-is-unique-and-hard-">Why C++ dependencies management is unique and hard ?</a></li>
          <li><a href="#inputs-from-the-qa" id="markdown-toc-inputs-from-the-qa">Inputs from the Q&amp;A</a></li>
          <li><a href="#my-takeaway-13" id="markdown-toc-my-takeaway-13">My Takeaway</a></li>
          <li><a href="#additional-resources-1" id="markdown-toc-additional-resources-1">Additional resources</a></li>
        </ul>
      </li>
      <li><a href="#️-jens-weller---meeting-c-update" id="markdown-toc-️-jens-weller---meeting-c-update">🗣️ <strong>Jens Weller</strong> - Meeting C++ update</a>        <ul>
          <li><a href="#whats-next-" id="markdown-toc-whats-next-">What’s next ?</a></li>
          <li><a href="#2026-conference" id="markdown-toc-2026-conference">2026 conference</a></li>
          <li><a href="#hommage-to-rainer-grimm" id="markdown-toc-hommage-to-rainer-grimm">Hommage to Rainer Grimm</a></li>
        </ul>
      </li>
      <li><a href="#lightning-talks" id="markdown-toc-lightning-talks">⚡Lightning talks</a>        <ul>
          <li><a href="#-james-mcnellis-our-most-teacherous-adversary" id="markdown-toc--james-mcnellis-our-most-teacherous-adversary">⚡ <strong>James McNellis</strong> Our most teacherous adversary</a></li>
          <li><a href="#-rahel-natalie-engel---let-them-eat-cake" id="markdown-toc--rahel-natalie-engel---let-them-eat-cake">⚡ <strong>Rahel Natalie Engel</strong> - let them eat cake</a></li>
          <li><a href="#-robin-savenen-soderholm---vector-to-array-let-the-compiler-turn-heap-into-static-storage" id="markdown-toc--robin-savenen-soderholm---vector-to-array-let-the-compiler-turn-heap-into-static-storage">⚡ <strong>Robin Savenen Soderholm</strong> - vector to array: let the compiler turn heap into static storage</a></li>
          <li><a href="#-ganest-rengasamy---meet-qt" id="markdown-toc--ganest-rengasamy---meet-qt">⚡ <strong>Ganest Rengasamy</strong> - Meet Qt</a></li>
          <li><a href="#-hannah-lenk---start-teaching-c" id="markdown-toc--hannah-lenk---start-teaching-c">⚡ <strong>Hannah Lenk</strong> - Start teaching C++</a></li>
          <li><a href="#-jens-weller---binary-trees" id="markdown-toc--jens-weller---binary-trees">⚡ <strong>Jens Weller</strong> - binary trees</a>            <ul>
              <li><a href="#my-takeaway-14" id="markdown-toc-my-takeaway-14">My takeaway</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><a href="#️-james-mcnellis---closing-keynote---a-little-introduction-to-control-flow-integrity" id="markdown-toc-️-james-mcnellis---closing-keynote---a-little-introduction-to-control-flow-integrity">🗣️ <strong>James McNellis</strong> - Closing Keynote - A little introduction to control flow integrity</a>        <ul>
          <li><a href="#my-takeaway-15" id="markdown-toc-my-takeaway-15">My takeaway</a></li>
        </ul>
      </li>
      <li><a href="#-allow-me-a-disgression-here" id="markdown-toc--allow-me-a-disgression-here">🤚 Allow me a disgression here</a>        <ul>
          <li><a href="#lets-code" id="markdown-toc-lets-code">Let’s code</a></li>
          <li><a href="#so-what-is-the-takeaway-for-me-on-this-" id="markdown-toc-so-what-is-the-takeaway-for-me-on-this-">So what is the takeaway for me on this ?</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#conclusion-1" id="markdown-toc-conclusion-1">Conclusion</a></li>
  <li><a href="#related-posts" id="markdown-toc-related-posts">Related posts</a></li>
</ul>

<h2 id="introduction">Introduction</h2>

<p>This year - and like every year: see my <a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669">trip-report for last year’s conference</a> - I attended Meeting C++ 2025. As always, the conference brought together a vibrant and passionate community of C++ developers, with a <strong>strong emphasis this year on safety</strong>, security, performance,<br />
as well as the human side of software development: particularly the role of lead developers, mentorship, and empathetic collaboration.</p>

<p>While I joined from home, I still very much enjoyed the experience of participating in discussions, chatting with attendees online, and learning from an excellent lineup of talks.</p>

<p>Also, I would like to sincerely thank my employer - <a href="https://www.fairmat.tech/">Fairmat</a> - for funding my participation in the conference for the second year in a row.</p>

<blockquote>
  <p>⚠️ <strong>Disclaimer</strong>:</p>

  <p>The opinions, interpretations, and conclusions expressed in this report - <em>and the “my takeaway”, “disgression”, and “conclusion” sections in particular</em> - are solely my own and do not necessarily reflect the views of my employer.<br />
While my participation in the conference was funded by my employer, they bear no responsibility for the content, opinions, or interpretations presented here.</p>
</blockquote>

<p>From this - admittedly far too long - trip report, I hope that if you couldn’t attend the conference this year, you can at least take away a small piece of the experience. And who knows, if you enjoy reading it, perhaps you’ll join in person or remotely next year 😉.</p>

<blockquote>
  <p>❓ Why spend nearly three months writing a &gt;80 commits, almost 2000-lines trip report ?</p>

  <p>First and foremost, this document is for future me. I cannot <code class="language-plaintext highlighter-rouge">ctrl+f</code> my own memory, but I can search this report to quickly recover who said what, about which topic, and in what context.<br />
Like any conference report, it cannot fully capture the depth, precision, and nuance of every talk; what follows is therefore my own understanding and interpretation of the speakers’ messages.<br />
Beyond documentation, the act of writing itself matters: it helps me internalize the ideas, connect themes across talks, and turn fleeting impressions into lasting knowledge.</p>
</blockquote>

<blockquote>
  <p>⏩ What’s comming next ?</p>

  <p>I’ll make sure to add <a href="https://www.youtube.com/@MeetingCPP/videos">🎥 videos</a> and <a href="https://meetingcpp.com/mcpp/slides/?year=2025">📄 slides</a> links when available.</p>
</blockquote>

<p>Resources:</p>

<ul>
  <li><a href="https://meetingcpp.com/mcpp/schedule/">Schedule</a></li>
  <li><a href="https://meetingcpp.com/mcpp/slides/?year=2025">Slides</a></li>
  <li><a href="https://www.youtube.com/@MeetingCPP/videos">Youtube Channel</a></li>
</ul>

<h2 id="-11062025">📅 11/06/2025</h2>

<h3 id="️jens-weller-welcome-message">🗣️<strong>Jens Weller</strong>: Welcome Message</h3>

<p>The conference opened, as tradition, with a warm welcome from Jens Weller, the founder and organizer of Meeting C++.<br />
Jens provided an overview of what to expect during the event:</p>

<ul>
  <li>3 keynotes</li>
  <li>54 talks spread across 4 tracks (plus an additional online-exclusive track)</li>
  <li>About 230 attendees onsite and 150 remote attendees</li>
</ul>

<h4 id="sponsors">Sponsors</h4>

<ul>
  <li>Gold sponsors: <a href="https://www.think-cell.com/meetingcpp">Think-cell</a>, <a href="https://www.kdab.com/">KDAB</a>, <a href="https://www.techatbloomberg.com/cplusplus">Bloomberg</a></li>
  <li>Video sponsors: <a href="https://woven.toyota/en/">Woven by Toyota</a>, <a href="https://www.jetbrains.com/cpp">JetBrains</a></li>
  <li>T-shirt sponsor: <a href="https://www.hudsonrivertrading.com/">HRT</a></li>
  <li>Online sponsor: <a href="https://qt.io/">Qt</a></li>
</ul>

<!--
![ThinkCell](https://meetingcpp.com/files/mcpp/sponsoren/logo_thinkcell_300.png)
![KDAB](https://meetingcpp.com/mcpp/sponsorlisting/pic/f401325_trusted376683x.jpg){: .size-small}
![Bloomberg](https://meetingcpp.com/mcpp/sponsorlisting/pic/f4905_Bloomberg_Engineering_Logo_Blk3946x.jpg){: .size-small}
![Woven by Toyota](https://meetingcpp.com/files/mcpp/sponsoren/wovenbytoyotalogo.jpg){: .size-small}
![JetBrainm](https://meetingcpp.com/files/mcpp/sponsoren/JB_develop_transpar_200.png)
![HRT](https://www.meetingcpp.com/files/mcpp/sponsoren/hrtlogo.png)
![Qt](https://meetingcpp.com/mcpp/booths/pic/f5650_qt_logo_small1319.jpg)
-->

<h4 id="creating-a-safe-and-inclusive-environment">Creating a <strong>safe</strong> and <strong>inclusive</strong> environment</h4>

<p>Jens reiterated the importance of a welcoming community, referencing the <a href="https://berlincodeofconduct.org/en">Berlin code of conduct</a>.<br />
A dedicated Trust &amp; Safety Team was available to ensure every participant could enjoy the conference comfortably.</p>

<p>He also acknowledged the continued attention to health considerations, including SARS-CoV2 prevention policies.</p>

<h4 id="in-memory-of-rainer-grimm">In memory of Rainer Grimm</h4>

<p>This year’s introduction carried a deeply emotional moment, with <a href="https://meetingcpp.com/blog/items/Remembering-Rainer-Grimm.html">the remembrance of Rainer Grimm</a>, who passed away on October 6th 2025, from ALS.<br />
Rainer has been a beloved figure in the C++ community - through his blog, his teaching, his books, and his presence at many conferences.</p>

<p>A small plush mascot named <a href="https://www.modernescpp.org/cippi/">Cippi</a> was on stage next to Jens, as Rainer’s symbolic presence.<br />
Instead of the planned session for this year, the conference replayed his talk from last year: an overview of upcoming C++26 features.</p>

<p>Attendees were encouraged to share messages for Rainer’s family and community via a QR code linking to his website, on Cippi’s tshirt.</p>

<p><a href="https://www.linkedin.com/in/klaus-iglberger">Klaus Iglberger</a> (one of my favorite conference speaker) will continue carrying Cippi at future conferences, preserving Rainer’s memory and acknowledging his impact.<br />
This tribute was a heartfelt reminder of the human connections that bind the C++ community together. ❤️</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/14-02-jens-weller-meeting-cpp-update-cippi-and-rainer.jpg" alt="Jens Weller: Meeting C++ update - survey" /></p>

<h3 id="️anthony-williams-software-and-safety-opening-keynote">🗣️<strong>Anthony Williams</strong>: Software and safety (Opening Keynote)</h3>

<p><a href="https://www.youtube.com/watch?v=wKGkOmpUTH8">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/software-safety475001.pdf">📄 slidedeck</a></p>

<p><a href="https://github.com/anthonywilliams">Anthony Williams</a> - ISO C++ Committee member (contracts) and low-level library developer at <a href="https://woven.toyota/en/">Woven by Toyota</a> - opened the conference with “Software and Safety”, a talk about how principles from safety-critical domains can (and should !) influence <strong>all</strong> software developments.</p>

<h4 id="what-safety-means-">What safety means ?</h4>

<p>Safety-critical software is any system where failure can cause injury or loss of life: automotive control, aircraft systems, factory and nuclear controls, or medical devices like pacemakers and CT scanners.<br />
But even outside those domains, <strong>software failures can cause real harm</strong>: financial loss, identity theft, or loss of trust, making safety relevant to every developer.</p>

<h4 id="standards-and-mindset">Standards and mindset</h4>

<p>Industries rely on standards such as ISO 26262 (automotive), DO-178C (aerospace), and IEC 62304 (medical).<br />
Even when these don’t apply, their mindset does: anticipate failure, design for resilience, and handle the unexpected gracefully.</p>

<h4 id="why-systems-fail-">Why systems fail ?</h4>

<p>Many failures arise from situations developers never considered: <em>“that could never happen”</em>.<br />
Hardware faults, invalid inputs, and corner cases often lead to bugs.<br />
Good design anticipates these events instead of assuming perfect conditions.</p>

<h4 id="undefined-behaviors-ub-and-reliability">Undefined behaviors (UB) and reliability</h4>

<p>Anthony connected software safety to undefined behavior (UB) in C++ - “behavior for which the standard imposes no requirements”.
In safety-critical code, UB is unacceptable. Preventing it means enforcing memory safety, input validation, and robust testing.
Tools like static analysis, sanitizers, and hardened libraries help detect problems both at build time and runtime.</p>

<h4 id="contracts-in-c26-as-a-safety-leverage">Contracts in C++26 as a safety leverage</h4>

<p>C++26 introduces <a href="https://en.cppreference.com/w/cpp/language/contracts.html">contracts</a> for expressing preconditions and postconditions directly in code:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="k">auto</span><span class="o">*</span> <span class="n">ptr</span><span class="p">)</span>
  <span class="n">pre</span><span class="p">(</span><span class="n">ptr</span> <span class="o">!=</span> <span class="nb">nullptr</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">auto</span><span class="o">&amp;</span> <span class="n">ref</span> <span class="o">=</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Contract violations represent real bugs. In safety-critical systems, handlers may trigger a state safe reset (depending on the use-case),
while in others, they might choose to continue or abort cleanly.</p>

<h4 id="defense-in-depth-using-appropriate-strategy-and-tools">Defense in depth, using appropriate strategy and tools</h4>

<p>Anthony described safety as a <a href="https://en.wikipedia.org/wiki/Swiss-cheese-model"><strong>Swiss Cheese</strong> model</a>: multiple imperfect layers together form a strong defense.
No single measure is sufficient, but combined they create resilience thus trust.</p>

<ul>
  <li><strong>Design checks</strong>: prevent problems upstream and by-design.
    <ul>
      <li>Initialize all your variables</li>
      <li>Use safe APIs: ranges <code class="language-plaintext highlighter-rouge">at</code> instead of <code class="language-plaintext highlighter-rouge">operator[]</code>, etc.</li>
      <li>No raw pointers: prefer <a href="https://en.cppreference.com/w/cpp/container/span.html">std::span</a>, <a href="https://en.cppreference.com/w/cpp/string/basic-string-view.html">std::string-view</a>, etc.</li>
      <li>No indexing: prefer range-based for-loops</li>
      <li>Use RAII to manage lifetime</li>
      <li>Use contracts: <a href="https://en.cppreference.com/w/cpp/language/contracts.html">C++26 contracts</a>, or even just documentation as it’s better than nothing.</li>
    </ul>
  </li>
  <li>Investigate bugs: debugger, stack-trace, core-dump, custom logs of states</li>
  <li>Hardened libraries</li>
  <li><strong>Testing</strong>: problematic inputs like too long strings, negative quantity, SQL query injection attacks, etc.</li>
  <li><strong>Fuzzing</strong>: <a href="https://lcamtuf.coredump.cx/afl/">American Fuzzy Lop</a> ❤️</li>
  <li><strong>Static analysis tools</strong>: <a href="https://clang.llvm.org/extra/clang-tidy/">clang-tidy</a>, <a href="https://codeql.github.com/">CodeQL</a>, <a href="https://www.sonarsource.com/products/sonarqube/">SonarQube</a></li>
  <li>Sanitizers</li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/01-anthony-williams-software-and-safety-opening-keynote.jpg" alt="Anthony Williams - Software and safety (opening-keynote) - Swiss Cheese model" /></p>

<h4 id="the-arene-base-library">The Arene Base library</h4>

<p>Woven by Toyota is developing <a href="https://woven.toyota/en/arene/">Arene</a> Base Library <em>(will be available in open-source soon)</em>, a foundation for safety-critical software that meets <a href="https://en.wikipedia.org/wiki/AUTOSAR">AUTOSAR</a> and <a href="https://en.wikipedia.org/wiki/Motor-Industry-Software-Reliability-Association">MISRA</a> guidelines <em>(so it’s C++14/17 for now 😥 tho)</em>.<br />
It includes static containers (inline-vector, inline-map, inline-string, etc.), backports of modern feature like non-owning ranges (span, string-view, mdspan), and enforced precondition checks.</p>

<h4 id="my-takeaway">My takeaway</h4>

<p>I really enjoyed this talk - it felt 100% legitimate to start the conference by addressing the current <em>“C++ is unsafe”</em> criticism/buzz head-on.</p>

<p>👉 Repeated, loud claims that “C++ is unsafe” contribute to a cognitive bias known as the <strong>exposure bias</strong> (related to the <strong>familiarity principle</strong>): when the same simplified message is heard often enough, it starts to be perceived as an unquestionable truth, regardless of context or nuance.<br />
Over time, this shapes collective perception - especially among juniors who lack technical perspective, and among managers or decision-makers who may not have the expertise to challenge such claims. The result is not informed judgment, but decisions driven by repetition, fear, and oversimplification rather than by facts, trade-offs, and real-world constraints.</p>

<p>As this was my first time attending a talk from Anthony Williams, and I was genuinely impressed by how detailed yet fluid and approachable his presentation was.<br />
He managed to cover a technically dense topic with clarity and purpose, setting a strong and confident tone for the rest of the conference.</p>

<p>Moreover, this topic strongly resonates with the engineering practices I advocate for on a daily basis in my professional work, which naturally reinforced the positions and recommendations I drew from these talks.</p>

<p>That said, experience has shown me how challenging it often is to raise awareness - especially among product owners and managers - about the importance of safety, testing, sound software design, code quality, modern development practices, and <strong>pragmatism</strong> in general.<br />
Too frequently, the focus shifts toward delivering something that <strong>merely appears to work</strong>, validated by a quick demo covering a narrow, happy-path use case, and pushed to production as fast as possible.</p>

<p>From my perspective, this does not constitute delivering value. On the contrary, it creates false assumptions about the product, fosters a bug-prone environment, and builds software on fragile foundations that will inevitably crumble over time.
👉 This concern is not a matter of developer preference or perfectionism: <strong>our responsibility is to deliver durable value</strong>, not unstable or misleadingly functional components. If only the simplest scenarios are “tested”, and no appropriate tools are used, how can we confidently claim that the system actually works ?<br />
💡 Addressing these issues later invariably costs far more than doing things properly from the start.</p>

<p>This is why, for me, <strong>establishing a clear and shared Definition of Done (DoD)</strong> - and actively educating all stakeholders around it - is essential for every project, product, and team. Peter Muldoon delivered an interesting talk about DoD last year, here at MeetingCpp: <a href="https://www.youtube.com/watch?v=pE8k3RXdp8s">Software Engineering Completeness : Knowing when you are Done and Why it matters ?</a>.</p>

<p>💡 Too often, short-term delivery - followed by constant patching - are rewarded more visibly than long-term engineering quality. Shipping something quickly and repeatedly fixing issues in production can create the perception of efficiency: such developers are seen as fast, reactive, and indispensable when problems arise.<br />
This visibility aligns well with <strong>managerial metrics that favor immediate outcomes and rapid response</strong>.</p>

<p>In contrast, developers who invest time in thoughtful design, thorough testing, and safety-oriented practices tend to operate quietly. Their work prevents incidents rather than reacting to them, which makes its impact far less visible. As a result, they are sometimes perceived as slow or inefficient, despite delivering systems that are reliable: robust, maintainable, and resilient to change.</p>

<p>At its core, this is a question of effort visibility and incentives. <strong>Reactive work is easy to observe; preventive work is easy to overlook</strong>. Yet the real measure of value lies not in how quickly issues are patched, but in how rarely they occur - and in how sustainably the system can evolve over time.</p>

<hr />

<p>I’ll also make sure to check the <a href="https://github.com/ETLCPP/etl">ETL library</a> and its <a href="https://github.com/ETLCPP/etl-arduino">Arduino variant</a>, as it offers a complementary solution tailored to best fit the embedded restrictions and needs.</p>

<p>Interesting/valuable inputs from the questions session:</p>

<ul>
  <li>Why would one choose a normal/soften library over an hardened one ? 👉 Optimized for speed vs. optimized for safety.</li>
  <li>The vocabulary we use when talking to managers matters: <strong>weaken/soften</strong> libraries might sounds like something’s wrong, while we’d rather underline what the tradeoffs are.</li>
</ul>

<h3 id="️sebastian-theophil-to-err-is-human-robust-error-handling-in-c26">🗣️<strong>Sebastian Theophil</strong>: To Err is Human: Robust Error Handling in C++26</h3>

<!--
vs. 🗣️**Joel Falcou**: From Acrobatics to Ergonomics - A Field Report on How to Make Libraries Helpful ([video link](https://www.youtube.com/watch?v=etAGLosphoc))
-> will do it again at a CppFrUG meetup 💖
-->

<p><a href="https://www.youtube.com/watch?v=CbFJGjQTh8M">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/toerrishuman739400.pdf">📄 slidedeck</a></p>

<p>Everyday mistakes can make software brittle, unpredictable, or just plain frustrating.<br />
Sebastian Theophil (<a href="https://www.think-cell.com/en">Think-cell</a>) delivered an excellent overview of the current landscape of error management in C++.<br />
His message was clear: error handling is hard, often undervalued, and yet absolutely central to building trustworthy systems.</p>

<blockquote>
  <p>💡 <strong>Key takeaway</strong>: 5% of all error handlers handle 95% of problems.</p>
</blockquote>

<h4 id="the-landscape-of-error-handling-historical-perspective">The landscape of error handling: historical perspective</h4>

<p>Sebastian began by contrasting reliability with error handling. Reliability demands considering faulty hardware, corrupted RAM, or broken sensors.<br />
Error handling, in comparison, is “easy” - yet/still often done poorly.<br />
Unexpected environments, unforeseen usage scenarios, and simple programmer mistakes are enough to cause cascades of bugs. Bad error handling accumulates technical debt and drains team efforts/time/motivation without delivering customer value.</p>

<ul>
  <li><strong>C error handling</strong>: errno, out parameters, ambiguous return codes</li>
  <li><strong>C++ exceptions</strong>:
    <ul>
      <li>suffer from bad reputation: “glorified gotos”, performances, banned from some codebases, unobvious control flow, etc.</li>
      <li>yet have strengths: any line can fail and unwinding can clean up state automatically.</li>
      <li><em>💡Pro-tip: catch exceptions as locally as possible</em></li>
    </ul>
  </li>
</ul>

<h4 id="the-modern-stuffs-stdexpected">The modern stuffs: <a href="https://en.cppreference.com/w/cpp/utility/expected.html">std::expected</a></h4>

<p>Sebastian highlighted <a href="https://en.cppreference.com/w/cpp/utility/expected.html">std::expected</a> as the likely <em>“next big thing</em>” in C++ error handling:</p>

<ul>
  <li>structured like return values</li>
  <li><strong>expressive</strong> like exceptions</li>
  <li>and backed by a useful monadic API - <a href="https://en.cppreference.com/w/cpp/utility/optional.html">like std::optional</a> - <em>(transform, transform-error, and-then, or-else, etc.)</em>.</li>
</ul>

<p>This feature encourages <strong>deliberate handling</strong> without the unpredictability of exception-based control flow,<br />
which from my perspective best in many, many designs.</p>

<h4 id="the-modern-stuffs-contracts">The modern stuffs: <a href="https://en.cppreference.com/w/cpp/language/contracts.html">contracts</a></h4>

<p>He then connected this with C++26 <a href="https://en.cppreference.com/w/cpp/language/contracts.html">contracts</a>, which offer customizable assertion mechanisms for expressing <strong>preconditions</strong> and <strong>postconditions</strong>.</p>

<p>This is a great replacement for “documented by not checked” runtime requirements, just like <a href="https://en.cppreference.com/w/cpp/language/constraints.html">constraints and concepts</a> did for <a href="https://en.cppreference.com/w/cpp/named-req.html">named requirements</a> at compile-time.</p>

<p>Bonus, <code class="language-plaintext highlighter-rouge">contracts</code> support exceptions (leading to contract violation), and are supported in constexpr contexts !</p>

<p>Contracts error handling strategy/semantic can be selected/customized at build-time, making them suitable for both debugging and hardened production builds.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">ignore</code>: do nothing</li>
  <li><code class="language-plaintext highlighter-rouge">observe</code>: call contract violation handler</li>
  <li><code class="language-plaintext highlighter-rouge">enforce</code>: call contract violation handler and terminate</li>
  <li><code class="language-plaintext highlighter-rouge">quick-enforce</code>: terminate</li>
</ul>

<p>Crucially, they allow side effects such as logging - provided that these do not alter the program correctness.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">f</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span>
    <span class="n">pre</span><span class="p">(</span><span class="n">x</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>       <span class="c1">// implicitly const</span>
    <span class="n">post</span><span class="p">(</span><span class="n">r</span> <span class="o">:</span> <span class="n">r</span> <span class="o">!=</span> <span class="n">x</span><span class="p">)</span>  <span class="c1">// r is const, x must be const</span>
<span class="p">{</span>
    <span class="n">contract</span><span class="o">-</span><span class="n">assert</span><span class="p">(</span><span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">x</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">f</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">);</span>   <span class="c1">// redecl. without contract is ok</span>
</code></pre></div></div>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/02-sebastian-theophil-to-err-is-human-robust-error-handling-in-cpp26.jpg" alt="Sebastian Theophil: To Err is Human: Robust Error Handling in C++26 - contract customization" /></p>

<h4 id="library-hardening-in-c26">Library hardening in C++26</h4>

<p>The upcoming standards - see the <a href="https://isocpp.org/files/papers/P3471R1.html">standard library hardening</a> proposal - bring enforced pre and postconditions to the standard library itself, turning many previously documentation-only requirements into runtime-validated checks.</p>

<p>Compiler vendors already provide early support, offering (partially) hardened library modes:</p>

<ul>
  <li>GCC’s <a href="https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-fhardened">-fhardened</a></li>
  <li>Clang’s <a href="https://libcxx.llvm.org/Hardening.html">LIBCPP-HARDENING-MODE</a></li>
  <li>MSVC’s <a href="https://github.com/microsoft/STL/wiki/STL-Hardening">MSVC-STL-HARDENING</a>.</li>
</ul>

<h4 id="practical-rules-for-real-world-code">Practical rules for real-world code</h4>

<p>Sebastian underlined that with so many options to do so, proper error-handling can be challenging.</p>

<ul>
  <li>error handling must be easy, otherwise developers won’t do it</li>
  <li>error handling must be tested</li>
  <li>error handling must be focused where it matters</li>
</ul>

<p>He offered a set of rules shaped by <code class="language-plaintext highlighter-rouge">ThinkCell</code>’s own engineering experience:</p>

<ul>
  <li><strong>Check everything</strong>: every API call, every return value. Use consistent wrappers for various error-reporting mechanisms.</li>
  <li>Use <code class="language-plaintext highlighter-rouge">noexcept</code> by default and rely on <code class="language-plaintext highlighter-rouge">std::terminate</code> and custom terminate handlers for unexpected failures.</li>
  <li><strong>Assert aggressively</strong>, even in release builds, and treat assertions as diagnostics - not reasons to exit.</li>
  <li>Design under the assumption that things usually work to keep the number of code paths manageable.</li>
  <li>When checks fail, <strong>gather as much informations</strong> as possible and <strong>attempt to continue safely</strong> (aligning with the “observe” contract mode).</li>
  <li>Focus efforts where the real problems are: historically, a small fraction of error handlers catch the vast majority of failures.</li>
</ul>

<p>He also categorized error types:</p>

<ul>
  <li>critical issues (null dereferences, unexpected API failures, assertion failures, etc.)</li>
  <li>untested scenarios</li>
  <li>“bad expected” (third-party bugs)</li>
  <li>and broken environments (weird configurations)</li>
</ul>

<h4 id="about-thinkcells-error-reporting">About <code class="language-plaintext highlighter-rouge">ThinkCell</code>’s error reporting</h4>

<p>Sebastian concluded by describing ThinkCell’s comprehensive out-of-process error reporting system.</p>

<p>Similar in spirit to <a href="https://github.com/chromium/crashpad">Google’s Chromium Crashpad</a> but designed for all kinds of errors, it generates a context (gathering as many infos as possible) to then allow developers to best investigate issues,<br />
by suspending the failing process, generates OS-specific minidumps, uploads them (when/if user consent), performs server-side symbolication, callstacks localisation, and groups failures by emission sites.</p>

<p>This infrastructure lets pragmatically prioritize real-world issues and allocate effort efficiently,<br />
finding which areas of the codebase emits most problems (in perspective of time, versions, etc.).</p>

<h4 id="my-takeaway-1">My takeaway</h4>

<p>I really appreciated how pragmatic and straightforward this talk was. I already use <code class="language-plaintext highlighter-rouge">std::expected</code> on daily basis, and it consistently proves its value - especially when wrapping legacy error-code APIs or when I need fine-grained, explicit reactions to likely error cases in a convenient and reliable way.<br />
From my perspective, this style of error handling scales well in real products, and indeed is the “next big thing”.</p>

<p>Contracts, on the other hand, are something I haven’t tried in a professional setting yet, but I eagerly wait to.<br />
Hearing how they can be tuned from “debug aid” to “production hardening” made me genuinely craving to experiment more with them.</p>

<p>One of the strongest takeaways for me was how much real-world engineering depends on robust error handling: the customer-only bugs that never reproduce locally, the tiny set of handlers that end up catching the majority of problems, and the difference between merely showing an error message and actually fixing the underlying issue.</p>

<p>From my experience, far too many projects fall into the trap of only logging errors but never taking meaningful corrective action.<br />
Logs pile up without being even grouped, analyzed, categorized, or qualified, and they become a poor substitute for real error handling - effectively forcing developers to painfuly navigate through them by hand, which is inefficient, frustrating, and most of all, <strong>not</strong> error handling.</p>

<p>Related to this, I feel that many companies still struggle with non-reproducible or hard-to-reproduce issues (undefined behaviors, non-deterministic behavior, race conditions, unrecorded inputs, etc.), which becomes both expensive and exhausting to diagnose.<br />
Using the right tools - debuggers, static analyzers, runtime sanitizers, and adequate/structured C++ error-handling mechanisms - is essential to improving team effectiveness and overall product reliability.</p>

<p>👉 Sebastian’s examples made it clear that investing in high-quality error handlers is a worthy strategy, over the entire lifetime of a product.</p>

<h4 id="additional-resources-learn-more-about-error-handling">Additional resources: learn more about error handling</h4>

<ul>
  <li><a href="https://www.youtube.com/watch?v=HXJmrMnnDYQ">Peter Muldoon - Exceptionally Bad - The story on the misuse of exceptions and to do better</a></li>
  <li><a href="https://ldionne.com/2025/02/12/ODR-libcxx-hardening-profiles-and-contracts/">Louis Dionne - ODR, libc++ hardening, Profiles and Contracts</a></li>
  <li><a href="https://www.youtube.com/watch?v=t7EJTO0-reg">Security in C++ - Hardening Techniques From the Trenches - Louis Dionne - C++Now 2024</a></li>
</ul>

<h3 id="️nicolai-josuttis-using-stdgenerator-in-practice">🗣️<strong>Nicolai Josuttis</strong>: Using <code class="language-plaintext highlighter-rouge">std::generator&lt;&gt;</code> in Practice</h3>

<!-- vs. 🗣️**Tina Ulbrich**: The Code is Documentation Enough -->

<p><a href="https://www.youtube.com/watch?v=Qpj9fVOoVAk">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p><a href="https://www.josuttis.com/">Nicolai</a> gave an accessible tour of what <a href="https://en.cppreference.com/w/cpp/coroutine/generator.html">std::generator</a> brings to C++23, and how it finally sits on top of the coroutine machinery introduced in C++20.<br />
I appreciated how he framed coroutines not as something exotic dark wizardry/witchcraft, but simply as stackless (in C++) - yet stateful -, suspendable/resumable functions.</p>

<p>I was surprised to learn that <a href="https://en.wikipedia.org/wiki/Melvin-Conway">Melvin Conway</a> coined the term as early as 1958.<br />
It immediately reminded me of Peter Sommerlad’s talk from last year here at the Meeting C++ conference - <a href="https://www.youtube.com/watch?v=g6QYGW-TwwY">Collective Amnesia?</a> - which explored how many supposedly “modern” ideas actually have deep roots in earlier programming models, along with several other invaluable insights for developers. (If you haven’t seen it yet, go watch it !).</p>

<h4 id="what-coroutines-are-and-arent">What coroutines are (and aren’t)</h4>

<p>C++ coroutines are <strong>functions</strong> that can <strong>pause</strong> and later <strong>resumed</strong> exactly where they left off.<br />
C++ coroutines are <strong>stackless</strong>: instead of relying on the stack, their <strong>state</strong> lives separately, which lets you write code that looks perfectly sequential while actually running asynchronously or producing values lazily-even infinite sequences if you want.</p>

<p>In practice, any function that includes any of the <code class="language-plaintext highlighter-rouge">co-yield</code>, <code class="language-plaintext highlighter-rouge">co-await</code>, or <code class="language-plaintext highlighter-rouge">co-return</code> keywords becomes a coroutine, it’s that simple.</p>

<h4 id="what-stdgenerator-brings">What <a href="https://en.cppreference.com/w/cpp/coroutine/generator.html">std::generator</a> brings</h4>

<p>The talk really clicked when transitioning from the low-level coroutine model to the high-level <code class="language-plaintext highlighter-rouge">std::generator&lt;T&gt;</code> abstraction. Seeing generators used as range-like, lazy value producers made the mechanics intuitive and ready-to-use:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">begin()</code> starts running the coroutine until the first co-yield</li>
  <li><code class="language-plaintext highlighter-rouge">operator*</code> accesses the yielded value</li>
  <li><code class="language-plaintext highlighter-rouge">operator++</code> resumes execution until the next suspension point</li>
</ul>

<p>He illustrated this with simple examples such as <a href="https://en.wikipedia.org/wiki/Fibonacci-sequence">Fibonacci sequence</a> generation and building a <code class="language-plaintext highlighter-rouge">concurrent-queue</code> reader coroutine.<br />
The contrast with old user-defined stateful functors made it obvious how much cleaner and straight-forward generators are.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">generator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">coro</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">array</span> <span class="n">coll</span><span class="p">{</span> <span class="s">"tic"</span><span class="p">,</span> <span class="s">"tac"</span><span class="p">,</span> <span class="s">"toe"</span> <span class="p">};</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">coll</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
        <span class="n">co</span><span class="o">-</span><span class="n">yield</span> <span class="n">coll</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="c1">// suspend with value</span>
<span class="p">}</span>

<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">value</span><span class="o">:</span> <span class="n">coro</span><span class="p">()){</span>
    <span class="n">std</span><span class="o">::</span><span class="n">println</span><span class="p">(</span><span class="n">value</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ouput:</p>

<pre><code class="language-log">tic
tac
toe
</code></pre>

<p>See example <a href="https://godbolt.org/z/3oW4jr33h">here on godbolt</a></p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/03-nicolai-josuttis-std-generator-in-practice.jpg" alt="Nicolai Josuttis: Using `std::generator&lt;&gt;` in Practice - `std::generator&lt;&gt;`" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;cstdint&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;generator&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;print&gt;</span><span class="cp">
</span>
<span class="n">std</span><span class="o">::</span><span class="n">generator</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">uint64</span><span class="o">-</span><span class="n">t</span><span class="o">&gt;</span> <span class="n">fibonacci</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">uint64</span><span class="o">-</span><span class="n">t</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">co</span><span class="o">-</span><span class="n">yield</span> <span class="n">a</span><span class="p">;</span>
        <span class="k">auto</span> <span class="n">next</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
        <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
        <span class="n">b</span> <span class="o">=</span> <span class="n">next</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">auto</span> <span class="n">view</span> <span class="o">=</span> <span class="n">fibonacci</span><span class="p">()</span> <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">enumerate</span> <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">take</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">element</span> <span class="o">:</span> <span class="n">view</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="k">auto</span> <span class="o">&amp;</span> <span class="p">[</span><span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="n">element</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">println</span><span class="p">(</span><span class="s">"{:2} -&gt; {}"</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/03-2-nicolai-josuttis-std-generator-in-practice.jpg" alt="Nicolai Josuttis: Using `std::generator&lt;&gt;` in Practice - `generator&lt;&gt;` vs. class" /></p>

<h4 id="pitfalls-and-caveats">Pitfalls and caveats</h4>

<p>Nicolai didn’t shy away from discussing the limitations, and I genuinely appreciated that. Few things are more frustrating than seeing a conference talk showcase something impressive, only to have it fall apart the moment you try to use it in the real world, immediatly falling from the “peak of mount Stupid” down to the “valley of despair” (<a href="https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger-effect">Dunning-Kruger effect</a>).</p>

<p>Important points:</p>

<ul>
  <li>Generators are <strong>single-pass</strong>: iterating more than once is <strong>undefined behaviors</strong> (like stateful views).</li>
  <li><strong>Lifetime</strong> matter: you shouldn’t take parameters by reference if they might not outlive suspension.</li>
  <li>Yielded values often behave like references.</li>
  <li>You cannot iterate a generator when the object is const, since begin() mutates state.</li>
  <li><code class="language-plaintext highlighter-rouge">std::generator&lt;&gt;</code> is non-copyable.</li>
  <li>Error management: exceptions propagate normally through the generator, back to the caller.</li>
</ul>

<p>So one should not assume container semantics.</p>

<h4 id="my-takeaway-2">My takeaway</h4>

<p>I especially enjoyed this talk from a meta perspective: the way the speaker presented and demonstrated the feature made it feel accessible, simple and approachable, without romanticizing it - just a clear, pragmatic view.</p>

<p>Nicolai’s explanations further reinforced why this abstraction can be so useful/powerful. From a design standpoint, it cleanly decouples value generation from consumption in a way that feels natural in contemporary C++.</p>

<p>The boilerplate required for custom coroutine types is still heavy - my own experience is around 100 lines for something usable - so I’m genuinely looking forward to future coroutine helpers in the standard.<br />
I’m also especially curious about how well this whole model integrates with concurrency and networking scenarios. The idea of coroutine-based pipelines for network message handling or sensor data acquisition is very compelling.</p>

<p>Despite coroutines having been introduced in C++20, I definitely haven’t experimented enough with them yet. This talk left me wanting to spend a lot more time exploring what they can do.</p>

<h4 id="additional-resources-learn-more-about-coroutines">Additional resources: learn more about coroutines</h4>

<ul>
  <li>👉 <a href="https://www.youtube.com/watch?v=b6pYieNd-OY">C++ Coroutines Demystified - Phil Nash - ACCU 2025</a></li>
  <li><a href="https://www.youtube.com/watch?v=cnGKRRduFtE">C++ Coroutines from scratch - Phil Nash - Meeting C++ 2022</a></li>
  <li><a href="https://www.youtube.com/watch?v=8sEe-4tig-A">C++20’s Coroutines for Beginners - Andreas Fertig - CppCon 2022</a></li>
  <li>And this very fun, simple, and short video by <a href="https://tartanllama.xyz/">Sy Brand</a>: <a href="https://www.youtube.com/watch?v=fstYQ1Zq73A">Coroutines Explained with My Cat</a></li>
</ul>

<h3 id="️sandor-dargo-code-reviews-building-better-code-and-stronger-teams">🗣️<strong>Sandor Dargo</strong>: Code Reviews: Building Better Code and Stronger Teams</h3>

<p><a href="https://www.youtube.com/watch?v=ahpbfpb-Yqc">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/Code-Reviews---Meeting-C++-2025570171.pdf">📄 slidedeck</a></p>

<p>Sandor’s talk focused on a topic that every developer deals with <strong>daily</strong>, yet few teams truly master: <strong>code reviews</strong>.<br />
What I appreciated is that he didn’t treat code reviews as a mere technical gate, but as a human process - one that can teach, uplift, frustrate, or damage depending on how it’s handled. In that way, it reminds me of <a href="https://www.youtube.com/watch?v=zjH2d5VhTD8">Kate Gregory’s talk at CPPP 2019 Emotional Code</a>, which is IMO a masterpiece.<br />
He explored why reviews matter, why they can go wrong, and how to make them constructive both for the codebase and the people involved.</p>

<h4 id="the-value-of-code-reviews">The value of code reviews</h4>

<p>Sandor broke down code reviews into three complementary roles:</p>

<ul>
  <li><strong>Quality assurance</strong>: catching inconsistencies, design flaws, unclear logic, architectural drift, or naming issues.<br />
Not a silver bullet, but an important final human check after all the automation.</li>
  <li><strong>Knowledge sharing</strong>: spreading API familiarity, explaining context, avoiding the “only the author knows this” trap.</li>
  <li><strong>Mentoring opportunity</strong>: especially for juniors, reviews can clarify the “why”, not just the “what”, and help them grow with empathy.</li>
</ul>

<p>He also highlighted review formats: <strong>synchronous</strong> (pair or mob programming, dedicated review meetings) vs. <strong>asynchronous</strong> (pull requests).<br />
Pair/mob programming offer immediate feedback and shared understanding, while PRs encourage reflection and diverse viewpoints.</p>

<h4 id="common-arguments-and-misconceptions">Common arguments and misconceptions</h4>

<ul>
  <li>👉 <strong>“Reviews slow us down”</strong>: true in the short term, but they prevent costly rework and architectural decay.</li>
  <li><strong>“Reviews don’t catch bugs”</strong>: also true. They’re better at catching design mistakes, complexity, readability issues, or misunderstandings - the subtle stuff tests rarely detect.</li>
  <li>Tradeoffs exist, but the long-term payoff is healthier code and stronger teams.</li>
</ul>

<h4 id="the-human-aspects">The human aspects</h4>

<p>Sandor underlined how important <strong>empathy</strong> and <strong>communication</strong> are:</p>

<ul>
  <li>Tone is easily misinterpreted in writing.</li>
  <li>Comments should avoid blame, judgement, or condescending phrasing.</li>
  <li>Excessive commenting or unclear prioritization overwhelms authors.</li>
  <li>Poorly prepared PRs (too large, red, unrelated changes, no description) sabotage the process.</li>
</ul>

<p>His summary of common pitfalls really resonated: late feedback, nit-picking, bossy language, unclear blocking status/reason, and comments lacking explanation.</p>

<h4 id="sandors-air-methodology">Sandor’s <strong>AIR</strong> methodology</h4>

<p>Sandor wrapped up with his own structure for writing comments:</p>

<ul>
  <li><strong>A</strong> - <strong>Action</strong>: what the individual contributor (IC) should do.</li>
  <li><strong>I</strong> - <strong>Information</strong>: why it matters.</li>
  <li><strong>R</strong> - <strong>Reference</strong>: where to learn more (link to guideline, documentation, etc.) that best justify the feedback</li>
</ul>

<p>Which results in a simple, predictable shape that keeps feedback actionable, polite, and grounded.</p>

<p>Interestingly, This reminds me of the <a href="https://en.wikipedia.org/wiki/Cucumber-(software)#Gherkin-language">Gherkin language</a> in <a href="https://en.wikipedia.org/wiki/Cucumber-(software)">Cucumber</a>, used for <strong>behavioral specifications</strong> (scenario, Given, When, Then),<br />
that I use on daily basis to create backlog entries (features specs, issues, bugs, etc.).<br />
The key idea here is to produce a predictable, narrative format that helps reduce ambiguity and clarifies intent and legitimacy.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/04-sandor-dargo-building-better-code-and-stronger-teams-air.jpg" alt="Sandor Dargo: Code Reviews: Building Better Code and Stronger Teams - AIR formula" /></p>

<h4 id="my-takeaway-3">My takeaway</h4>

<p>I found the idea of delivering a talk about this topic very relevant. For the past decade, a large portion of my role as a lead-developer has revolved around reviewing code, coaching colleagues, and helping teams to deliver value.<br />
So hearing Sandor frame reviews as both a technical practice and a human one strongly resonated with me.</p>

<p>That said, I wished he had gone a bit deeper into the “real-world” part of timely reviews.<br />
He mentioned that PRs should be reviewed shortly after they’re created and should not linger for days, but the talk didn’t offer much practical advice for avoiding the ping-pong effect - especially common with junior developers or contributors unfamiliar with guidelines (or reluctant to follow them).<br />
In my experience, even when the team has clear rules, some PRs naturally drag and slow the entire delivery pipeline.</p>

<p>Many stakeholders and managers still view code reviews as something that slows down delivery.
As a lead developer, part of my job is to help them understand why this work is essential - but it’s not always easy. Just like testing, error handling, avoiding undefined behaviors, and building resilient designs, the value of thorough reviews often only becomes obvious when things go wrong.</p>

<p>And who hasn’t heard an IC complain to a manager: <em>“My PR works ! Why is the lead dev blocking it ? I just want to deliver value and reach my monthly performance goal”</em>  .
But <strong>protecting a codebase</strong> from accumulating exponential, untracked technical debt is hard to measure, yet absolutely vital. Solid reviews prevent the system from sliding toward a “point of no return,” where changes become prohibitively expensive - <em>or nearly impossible</em> - and development costs rise dramatically.</p>

<p>I also take a different stance on PR presentations. Unlike Sandor, I avoid <em>“let me walk you through the code”</em> meetings, because they tend to introduce <strong>biases</strong>, anchoring reviewers to the author’s narrative, and reducing the chance of catching misunderstandings.<br />
Instead, I prefer/favor clear PR summaries and design diagrams.</p>

<p>Reviewers’s role then is to evaluate the possible delta between:</p>

<ul>
  <li>what was requested</li>
  <li>what the author thinks they delivered</li>
  <li>and what is actually in the PR’s diff</li>
</ul>

<p>When that delta is too large, repetitive, or highlights a recurring technical error, then I second my review with a coaching sessions in order to avoid endless round-trips - thus speed-up the overall value delivery process.</p>

<h5 id="bonus-how-i-personally-do-code-reviews">Bonus: How I personally do code reviews</h5>

<p>Over the years I refined my own approach:</p>

<ul>
  <li><strong>Use the right tools</strong>: for instance if you’re using Microsoft VSCode then you really might want to give the <a href="https://github.com/microsoft/vscode-pull-request-github">microsoft/vscode-pull-request-github</a> extension a try, so code navigation is available to best understand the code context (types, values, call hierarchy, namespaces, etc.).</li>
  <li>
    <p>Structure comments consistently, for clarity and expectations management:</p>

    <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">🟢</span><span class="o">|</span><span class="err">🟡</span><span class="o">|</span><span class="err">🔴</span><span class="o">|</span><span class="err">❓</span><span class="o">|</span><span class="err">🐞</span> <span class="p">[</span><span class="n">categories</span><span class="p">...]</span> <span class="n">Description</span>
<span class="n">Reason</span><span class="o">/</span><span class="n">context</span><span class="p">,</span> <span class="n">with</span> <span class="n">references</span>
<span class="n">Action</span> <span class="n">requested</span>
</code></pre></div>    </div>

    <ul>
      <li>traffic lights
        <ul>
          <li>🟢 Not blocking</li>
          <li>🟡 Consider fixing. Add a tech-debt entry to the backlog otherwise.</li>
          <li>🔴 Blocking</li>
          <li>❓ Blocking: question (I did not understand something)</li>
          <li>🐞 Blocking: obviously a bug</li>
        </ul>
      </li>
      <li>categories
        <ul>
          <li>bug</li>
          <li>business (likely to degrade the users experience)</li>
          <li>readability
            <ul>
              <li>naming</li>
              <li>cognitive-complexity</li>
            </ul>
          </li>
          <li>design</li>
          <li>performances</li>
          <li>etc.</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Add reference links: the C++ standard relevant section, internal documentation, guidelines, etc.</li>
  <li>If you’re unsure about something, that uncertainty itself is - <em>and will remain</em> - a maintainability issue, as the IC intent is not clearly translated into code. Never hesitate to ask for clarification.</li>
  <li>Be kind, positive and encouraging. Acknowledge the efforts.</li>
  <li>Use some emojis like 🙂😊😅 so the user knows you’re not mad.</li>
  <li>Include a hint of positive reinforcement in your code-review summaries (👏🥳), especially when an IC successfully applied techniques covered in recent training/mentoring sessions.</li>
</ul>

<p>This structure keeps expectations clear and helps to keep reviews consistent and fair across all contributors.</p>

<h4 id="conclusion">Conclusion</h4>

<p>Overall, Sandor’s talk was a strong reminder that code reviews are not just about code quality - they’re a social contract within the team.<br />
When done well, they teach, support, and build trust.<br />
When done poorly, they erode relationships.<br />
I left the talk with a renewed motivation to continue investing in review culture and helping teams make the most of it.</p>

<h3 id="️anders-schau-knatten-the-two-memory-models">🗣️<strong>Anders Schau Knatten</strong> The Two Memory Models</h3>

<p><a href="https://www.youtube.com/watch?v=iEd9-ilEgdg">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/Knatten-The-Two-Memory-Models-MeetingCpp-202594762.pdf">📄 slidedeck</a></p>

<h4 id="what-are-the-two-memory-models-">What are the two memory models ?</h4>

<p>The programming language memory model</p>

<ul>
  <li>What programming languages (<code class="language-plaintext highlighter-rouge">C++</code>, <code class="language-plaintext highlighter-rouge">C</code>, <code class="language-plaintext highlighter-rouge">Rust</code>, etc.) guarantee</li>
  <li>Abstract over the physical reality</li>
  <li>Data race rules</li>
  <li>What are “observable behaviors”</li>
  <li>How atomics provide/guarantee synchronization and ordering</li>
  <li>Which reorderings the compilers are allowed to perform</li>
</ul>

<p>The CPU/architecture memory model</p>

<ul>
  <li>Which load/store orders hardware may produce</li>
  <li>How pipelines, store buffers, caches, and micro-ops reorder things</li>
  <li>How architectures differ (x86 stricter, ARM/RISC-V more relaxed)</li>
</ul>

<p>That duality - language vs. hardware - was the core concept of the talk, and understanding how they may not match each other intuitively is key to writing correct concurrent code and avoiding disasters.</p>

<h4 id="at-language-level">At language-level</h4>

<p>The standard describes an abstract machine, not real execution.</p>

<ul>
  <li>Compilers may reorder freely as long as observable behavior stays the same.</li>
  <li>Data races are UBs</li>
  <li><code class="language-plaintext highlighter-rouge">seq-cst</code> gives one global total order</li>
  <li>Acquire/release synchronizes like a lightweight mutex handoff</li>
  <li>Relaxed atomics don’t give cross-thread ordering.</li>
</ul>

<h4 id="at-cpu-level">At CPU-level</h4>

<p>CPUs reorder far more than we imagine.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">x86</code> never reorders stores, while <code class="language-plaintext highlighter-rouge">ARM</code> and <code class="language-plaintext highlighter-rouge">RISC-V</code> can reorder stores to different addresses</li>
  <li>Store buffers, pipelines, coalescing, etc. all affect observable ordering</li>
  <li>👉 Looking at assembly doesn’t prove your concurrent code is correct</li>
</ul>

<h4 id="mental-model-for-developers">Mental model for developers</h4>

<p>Not <em>“did instruction X run before Y ?”</em>, but <em>“does X happen-before Y ?”</em></p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/05-anders-schau-knatten-the-two-memory-models.jpg" alt="Anders Schau Knatten: The Two Memory Models - TSO example" /></p>

<h4 id="my-takeaway-4">My takeaway</h4>

<p>🤚 Disclaimer &amp; overall impression</p>

<p>This talk absolutely melted my brain - in the best possible way. While I’ve always found memory ordering intriguing, this session made it clear that I’ve only been barely scratching the surface, which is so exciting.<br />
I’ll definitely <strong>need at least one rewatch</strong> to get a slice of such a dense yet important topic: Anders covered both the language-level memory model and the CPU memory model, how they interact, and why they’re fundamentally different mental machines.</p>

<p>Even though I already use <code class="language-plaintext highlighter-rouge">std::atomic</code> regularly in simple use-cases, this talk left me with a much stronger desire to dig deeper into non-trivial patterns, lock-free reasoning, and the real consequences of memory ordering on correctness and performance.</p>

<p>In a nutshell, this made me realize how shallow my current mental model is around:</p>

<ul>
  <li>Subtle memory orderings</li>
  <li>Cross-architecture behavior resilence/consistency</li>
  <li>How atomics map to actual hardware</li>
  <li>Why I should dig deeper into lock-free algorithms/patterns</li>
</ul>

<p>I love the feeling of being humbled - <em>if not a bit dumb</em> - by a talk - it means there’s a whole new frontier to explore, thus an exciting room to level up ! 🥰</p>

<h4 id="additional-resources">Additional resources</h4>

<ul>
  <li><a href="https://knatten.org/">Anders’s blog</a></li>
  <li><a href="https://github.com/knatten/cppquiz">CppQuizz</a></li>
</ul>

<h2 id="-11072025">📅 11/07/2025</h2>

<h3 id="️jens-weller---good-morning-meeting-c">🗣️<strong>Jens Weller</strong> - Good Morning Meeting C++</h3>

<p>Jens opened day 2 sharing how he designed and implemented - using <a href="https://www.qt.io/">Qt</a> - this year’s conference merchs design for <a href="https://meetingcpp.myspreadshop.de/">T-shirts, hoodies (Spreadshirt)</a> and <a href="https://www.etsy.com/shop/meetingcpp">calendars (Etsy)</a>.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/meeting-cpp-2025-tshirt-logo.jpg" alt="meeting-cpp-2025-tshirt-logo" /></p>

<p>He also talked about his ongoing projects, including the Meeting C++ CMS and a small game-like ecosystem simulation with plants and animals acting as agents - which resonated with me, since creating entities simulations, implementing their behaviors and watching them evolve is a genuine passion of mine.<br />
From my perspective, it’s a great way to learn (about ECS, determinism, reproducibility vs. repeatability, software-design, performances, rendering, etc.) while having lots of fun.</p>

<p>From there, he touched on design perspectives like SOA vs. AOS/OOP, and mentioned that the schedule had been slightly adjusted due to Victor Ciura canceling his talk.
Jens also highlighted the cool stands this year: Qt’s booth with automotive automation demos, and Flow Traders’s.</p>

<p>He wrapped up by previewing next week’s post-conference workshops:</p>

<ul>
  <li>C++ software design - Klaus Iglberger</li>
  <li>(canceled) multi-threading and concurrency in C++: a workshop full of live coding</li>
  <li>AVX vectorization workshop - Ivica Bogosavljevic</li>
  <li>Intermediate to advanced C++ - Slobodan Dmitrovic</li>
  <li>MISRA C++ 2023 guidelines workshop - Richard Kaiser</li>
</ul>

<h4 id="my-takeaway-5">My takeaway</h4>

<p>I’ll definitly watch the trendy talk <a href="https://www.youtube.com/watch?v=SzjJfKHygaQ">“More Speed &amp; Simplicity: Practical Data-Oriented Design in C++” - Vittorio Romeo - CppCon 2025 Keynote</a> to dig deeper into the SOA vs. AOS topic, and DOD in general.</p>

<p>And like always, hearing about an ecosystem simulation project reignited my own itch to spin up a fresh entity-based experiment 😅. <em>So many things to do, so little time though.</em></p>

<h3 id="️-frances-buontempo---center-keynote---stoopid-questions">🗣️ <strong>Frances Buontempo</strong> - Center Keynote - Stoopid Questions</h3>

<p><a href="https://www.youtube.com/watch?v=zztvhcgXQco">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/frances-buontempo672314.pdf">📄 slidedeck</a></p>

<p>France’s keynote was a deep, reflective dive into learning, teaching, curiosity, and how important the role of so-called “stupid” questions is.<br />
She opened by reminding us that <strong>everyone learns differently</strong>, and that - despite the internet and LLMs - real learning still takes time, efforts, and explorations.</p>

<p>👉 We’re rarely taught <strong>how to learn</strong> or <strong>how to teach</strong>, yet both shape our careers, and ultimately lifes.</p>

<p>A recurring theme was the importance of <strong>asking questions</strong>: during talks, at work, in classrooms, even when something seems obvious.<br />
This is what I call <strong>proactive listening</strong>: will watching videos, I regularly find myself talking to the screen, anticipating the points that the speaker may/will address next.</p>

<p>But asking questions directly requires <strong>psychological safety</strong> and confidence - challenging a speaker, a book, a teacher, or a colleague can feel intimidating, even though they can be wrong too.<br />
In any case, it always worth it: if you have a question, then it means that you have not understood some points as the speaker intended – and probably other participants as well.</p>

<p>France highlighted blockers that slow learning: school baggage, neurodiversity challenges, bad teachers, or simply feeling stuck.<br />
She offered practical solutions/tools like rubber-ducking, shrinking the problem, <strong>exploring “what-ifs”</strong>, switching to a related task, or simply asking for help.<br />
And just as important: <strong>learning must be a fun process</strong> - through games, surprises, experimentation, and small wins.</p>

<p>She also touched on emotions in teaching and learning-frustration, boredom, non-linear progress - and the need for teachers to stay patient and adaptive.  Finally, she contrasted human learning with the limitations of machines: LLMs don’t learn, they don’t understand, and they often hallucinate.</p>

<p>This should often prompt us to ask more relevant questions, with the aim of finding a potentially relevant answer. Which, at best, is a waste of time, and at worst, a plain loss.</p>

<p>France closed with challenges for everyone:</p>

<ul>
  <li>Ask a question !</li>
  <li>Try something you feel terrible at</li>
  <li>Read a book</li>
  <li>Give a talk.</li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/06-frances-buontempo-stoopid-questions.jpg" alt="Frances Buontempo: Center Keynote - Stoopid Questions - who never" /></p>

<h4 id="my-takeaway-6">My takeaway</h4>

<p>For me, learning is effective over the long term only when it remains <strong>motivating and meaningful</strong>, and when it is treated as a daily practice. It should not be perceived as a constant effort or burden, but rather as dedicated time that one genuinely enjoys and values.</p>

<p>In practice, I have encountered many developers who become blocked not for technical reasons, but due to diminished confidence or reluctance to ask for help. Regardless of whether they identify as “junior” or not, some remain stuck for extended periods, choosing isolation over collaboration.<br />
In a fast-evolving ecosystem such as C++, this mindset can significantly hinder both individual growth and overall team effectiveness.</p>

<p>I have also observed a recurring pattern - in schools, universities, and many companies - where those who ask questions are often perceived as lacking competence, particularly on technical topics. Even requesting clarifications or additional specification details may be interpreted as a lack of autonomy.<br />
Such perceptions directly undermine psychological safety and discourage open communication.</p>

<blockquote>
  <p>🤦‍♂️ Ultimately, a learning culture that equates asking questions with incompetence is <strong>counterproductive and toxic</strong>.<br />
👉 Sustainable expertise emerges not from silent struggle, misplaced pride, or biased ICs KPIs, but from <strong>curiosity, dialogue, and the confidence to seek understanding</strong>.</p>
</blockquote>

<p>From my experience, <strong>side-projects</strong> work great and are often under-rated. I always encourage my ICs - <em>and juniors in particular</em> - to build something fun: games, simulations, little experiments, etc. because <strong>real problems expose your limits</strong>: poor design, performance bottlenecks, spaghetti code, poorly evaluated trade-offs, quick-win-but-slow-loose, etc.<br />
<strong>Hitting those walls creates an authentic need to understand and improve</strong>, and that kind of learning sticks far better than passive theory, endless katas, or rote exercises.<br />
While this requires time and courage, as confronting failures avoids biases and luring yourself into a false sense of understanding.</p>

<p>My own routine reflects this: I spend at least an hour every day - more on weekends - coding on side-projects, reading standard/books/blogs, browsing GitHub, and/or watching talks.<br />
It’s the balance of practice and passive input that works best for me. Ultimately, as Frances emphasized, everyone needs to discover how they learn before anything else.</p>

<blockquote>
  <p>👉 <strong>Psychological safety</strong> is essential: teams need a kind, supportive environment where people can rely on each others without fear of judgment. Misplaced ego or pride only slows everyone down and can even lead to disasters.</p>
</blockquote>

<p>🤦‍♂️ I also deeply regret that many companies still treat developer trainings - especially for juniors - as a waste of time.<br />
This fuels the myth of the so-called <em>“full-stack dev-sec-ops 10x engineer”</em> who is magically productive straight out of school, and can perform/achieve any task autonomously/independently in a short amount of time.<br />
Software development is a team sport that requires collaboration, shared understanding, and <strong>deliberate investment in people</strong>.</p>

<blockquote>
  <p>👉 Training is not a cost to be minimized, but a prerequisite for building resilient teams and sustainable software.<br />
👉 Real growth requires time, guidance, and a learning culture.</p>
</blockquote>

<p>In that spirit, I asked France about something I often struggle with: how to evaluate retention when designing a course, as each step depends on the previous one.</p>

<p>Her answer was simple and practical:</p>

<ul>
  <li>If some point takes longer to teach than expected, it’s a sign something’s wrong.</li>
  <li>Make it explicit that everyone must understand before moving on</li>
  <li>And (of course) constantly encourage questions</li>
</ul>

<p>This strongly resonates with my own experience: meaningful practice, supportive peers, and an environment where questions are welcomed are far more valuable than any amount of passive learning.</p>

<h3 id="️-jonathan-müller---cache-friendly-c">🗣️ <strong>Jonathan Müller</strong> - Cache-Friendly C++</h3>

<p><a href="https://www.youtube.com/watch?v=LHPOAcKqWFc">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/cache-friendly-cpp610063.pdf">📄 slidedeck</a></p>

<p><a href="https://www.jonathanmueller.dev/talk/cache-friendly-cpp/">Jonathan Müller</a> - <em>also known as <a href="https://www.foonathan.net/">foonathan</a></em> - gave an accessible overview about what designing cache-friendly C++ code really means, and why <code class="language-plaintext highlighter-rouge">std::vector</code> in particular should almost always be your default container.<br />
This talk is essentially a modern, refined follow-up to his <a href="https://www.youtube.com/watch?v=Nz9SiF0QVKY">2018 “Writing Cache-Friendly C++”</a> presentation here back at MeetingCpp.</p>

<p>He started from first principles: CPUs are extremely fast, but memory is not.<br />
Accessing main memory way slower than accessing data already stored in a CPU cache.<br />
This is why CPUs rely on several layers of caches (L1, L2, L3): L1 is tiny but extremely fast, L2 is slower but larger, and L3 is larger still but slower again - yet still much faster than accessing memory.</p>

<p>To run fast code, your data needs to reach these caches efficiently. Which starts with designing cache-friendly code <strong>and</strong> benchmarking such designs for your targeted architecture.</p>

<h4 id="cache-friendly-code-why-does-it-matter-">Cache-friendly code: why does it matter ?</h4>

<p>Cache-friendly programming is fundamentally about data locality:</p>

<ul>
  <li>Keeping related data contiguous and in a predictable layout</li>
  <li>Minimizing memory footprint so more data fits inside a single cache line</li>
  <li>Accessing memory sequentially whenever possible.</li>
</ul>

<p>If data is well packed and accessed in order, CPUs can prefetch it efficiently and process it with minimal <a href="https://en.wikipedia.org/wiki/Cache-(computing)#CACHE-MISS">cache misses</a>.</p>

<h4 id="data-structures-matter">Data structures matter</h4>

<p>This is why a sorted <a href="https://en.cppreference.com/w/cpp/container/vector.html">std::vector</a> often beats <a href="https://en.cppreference.com/w/cpp/container/set.html">std::set</a> or <a href="https://en.cppreference.com/w/cpp/container/unordered-set.html">std::unordered-set</a>:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">std::vector</code> is contiguous and/thus predictable</li>
  <li>Tree-based containers force pointer chasing and scattered memory access</li>
  <li>Open-addressing hash tables do better than node-based ones for the same reason.</li>
</ul>

<h4 id="type-size-and-layout-affect-cache-use">Type size and layout affect cache use</h4>

<p>Jonathan highlighted how even small layout decisions influence cache footprint:</p>

<ul>
  <li>Reordering struct members reduces padding</li>
  <li>Misaligned or sparsely laid-out data wastes precious cache space</li>
  <li>Bitfields can sometimes hurt due to extra work the compiler must generate</li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/07-01-jonathan-muller-cache-friendly-cpp-layout-members-ordering.jpg" alt="Jonathan Müller: Cache-Friendly C++ - struct members ordering" /></p>

<h4 id="prefetching--cache-lines">Prefetching &amp; cache lines</h4>

<ul>
  <li>CPUs move memory in cache lines, not bytes.</li>
  <li>Sequential access allows the hardware to prefetch aggressively.</li>
  <li>Random access breaks that pipeline and forces costly fetches from DRAM.</li>
</ul>

<h4 id="code-is-data-too">Code is data too</h4>

<p>CPU instructions are stored in memory</p>

<ul>
  <li>Avoid long branches</li>
  <li>Avoid indirect jumps</li>
  <li>Miniminze the size of hot code</li>
</ul>

<p>Jonathan mentioned that sum then increments rather than increments the sum can be significantly - if not, way - faster on some CPU, which feels kinda bizard.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/07-02-jonathan-muller-cache-friendly-cpp-takeaway.jpg" alt="Jonathan Müller: Cache-Friendly C++ - takeaway" /></p>

<h4 id="data-oriented-design-dod">Data-Oriented Design (DOD)</h4>

<p>He emphasized thinking in terms of algorithms and data flows, not objects.</p>

<ul>
  <li>Process N items together</li>
  <li>Re-organize your data to match access patterns</li>
  <li>Leverage SoA - rather than AoS - layouts when appropriate</li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/07-03-jonathan-muller-cache-friendly-cpp-dod-example.jpg" alt="Jonathan Müller: Cache-Friendly C++ - DOD" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/07-04-jonathan-muller-cache-friendly-cpp-dod-performances.jpg" alt="Jonathan Müller: Cache-Friendly C++ - DOD benchmarks" /></p>

<h4 id="multicore-pitfalls">Multicore pitfalls</h4>

<p><a href="https://en.wikipedia.org/wiki/False-sharing">False sharing</a> - two threads modifying unrelated values that live in the same cache line - can devastate scalability.
Padding structs with <a href="https://en.cppreference.com/w/cpp/thread/hardware-destructive-interference-size.html">std::hardware-destructive-interference-size</a> - <em>minimum offset between two objects to avoid false sharing</em> -  helps avoid this.</p>

<h4 id="my-takeaway-7">My takeaway</h4>

<p>This talk reinforced how critical it is - especially in performance-sensitive code - to think consciously about how data lives in memory.
Choosing containers, controlling alignment, avoiding unnecessary pointer dereferencing: these things matter more than most teams realize. Redesigning an entire system because of performance issues is often a long and costly process, so it’s far better to foreacast such problems and address them early.</p>

<p>I’ve long favored cache-friendly containers like <code class="language-plaintext highlighter-rouge">std::array</code> and <code class="language-plaintext highlighter-rouge">std::vector</code>, and this talk validated that instinct.<br />
<code class="language-plaintext highlighter-rouge">std::array</code> remains one of my favorite containers because it behaves both like a <code class="language-plaintext highlighter-rouge">tuple</code> and a <code class="language-plaintext highlighter-rouge">range</code> while keeping data contiguous 🥰.
From experience, <code class="language-plaintext highlighter-rouge">std::map</code> and <code class="language-plaintext highlighter-rouge">std::set</code> often loose to a simple <code class="language-plaintext highlighter-rouge">std::vector&lt;std::pair&lt;K, M&gt;&gt;</code> because contiguous memory access beats pointer-heavy tree traversal in many real workloads.<br />
Also, I remember struggling with performances issues when digging into <a href="https://en.wikipedia.org/wiki/Trie">trie containers</a> implementations, which is from my perspective a meaningful illustration of the “size in memory vs. speed” tradeoff.</p>

<p>Jonathan’s insights also made me want to explore <a href="https://en.wikipedia.org/wiki/Data-oriented-design">Data-Oriented Design</a> more deeply for large-scale or simulation-style workloads - where data locality matters a lot.</p>

<p>I’ll definitely continue digging into cache-friendly programming. It still feels underrated in the industry: too many teams default to pointer-rich OOP AoS designs (“everything is a <code class="language-plaintext highlighter-rouge">std::shared-ptr</code>”) without considering the cost on locality, cache lines, and ultimately performances.</p>

<p>This talk was a great reminder to structure programs around access patterns and data, not just obvious-for-humans abstractions.</p>

<h3 id="️-andreas-fertig---embedded-friendly-c-features-that-make-a-difference">🗣️ <strong>Andreas Fertig</strong> - Embedded-Friendly C++: Features That Make a Difference</h3>

<p><a href="https://www.youtube.com/watch?v=xxx">🎥 Video</a>, <a href="https://andreasfertig.com/talks/dl/afertig-2025-meeting-cpp-embedded-friendly-cpp--features-that-make-a-difference.pdf">📄 slidedeck</a></p>

<p>Andreas links: <a href="https://cppinsights.io/">cppinsights.io</a>, <a href="https://www.youtube.com/@andreas-fertig/videos">Youtube channel</a>, <a href="https://andreasfertig.com/talks/#past-talks">talks slide-decks</a>.</p>

<p>The talk was framed around a simple, relatable scenario: building embedded lightbulb controllers that communicate over a network. Using this example, Andreas walked through a series of common embedded tasks - parsing input, handling raw bytes, dealing with endianness, interfacing with C APIs, and managing memory safely - and showed how contemporain C++ (C++20/23/26) provides clean, safe, and expressive solutions.</p>

<h4 id="content">Content</h4>

<p>Andreas demonstrated a broad range of features, each tied to a concrete use-case:</p>

<ul>
  <li><strong>Safe parsing &amp; input handling</strong>: <a href="https://en.cppreference.com/w/cpp/container/span.html">std::span</a>, <a href="https://en.cppreference.com/w/cpp/utility/expected.html">std::expected</a>, <a href="https://en.cppreference.com/w/cpp/utility/from-chars.html">std::from-chars</a>, and <a href="https://en.cppreference.com/w/cpp/container/array/to-array.html">std::to-array</a>.</li>
  <li><strong>Expressive syntax</strong>: <a href="https://en.cppreference.com/w/cpp/language/user-literal.html">user-defined string literals</a> to improve readability.</li>
  <li><strong>Safe byte manipulation</strong>: <a href="https://en.cppreference.com/w/cpp/numeric/bit-cast.html">std::bit-cast</a> to reinterpret data without undefined behavior (rather than plain <a href="https://en.cppreference.com/w/cpp/language/reinterpret-cast.html">reinterpret-cast</a>).</li>
  <li><strong>Enum handling</strong>: <a href="https://en.cppreference.com/w/cpp/utility/to-underlying.html">std::to-underlying</a>, <a href="https://en.cppreference.com/w/cpp/types/underlying-type.html">std::underlying-type</a>.</li>
  <li><strong>Dealing with network data</strong>: <a href="https://en.cppreference.com/w/cpp/memory/start-lifetime-as.html">std::start-lifetime-as</a> to reinterpret packet bytes safely (as opposed to the common <code class="language-plaintext highlighter-rouge">reinterpret-cast</code> approach).</li>
  <li><strong>Endianness</strong>: <a href="https://en.cppreference.com/w/cpp/types/endian.html">std::endian</a> and <a href="https://en.cppreference.com/w/cpp/numeric/byteswap.html">std::byteswap</a>.</li>
  <li><strong>Resource management</strong>: <a href="https://en.cppreference.com/w/cpp/memory/unique-ptr.html">std::unique-ptr</a> with custom deleters for wrapping legacy APIs.</li>
  <li><strong>Modern compile-time features</strong>: <a href="https://en.cppreference.com/w/cpp/language/constexpr.html">constexpr</a>, <a href="https://en.cppreference.com/w/cpp/language/consteval.html">consteval</a>, <a href="https://en.cppreference.com/w/cpp/language/constinit.html">constinit</a>, <a href="https://en.cppreference.com/w/cpp/language/if.html">if consteval</a>, and static constexpr local variables.</li>
</ul>

<p>Overall, the talk was a tour of “modern tools solving common/old embedded problems” shown through minimal, digestible and realistic/plausible examples.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/08-01-andreas-fertig-embedded-friendly-cpp-features-that-make-a-difference-bit-cast.jpg" alt="Andreas Fertig: Embedded-Friendly C++: Features That Make a Difference - bit-cast" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/08-02-andreas-fertig-embedded-friendly-cpp-features-that-make-a-difference-start-lifetime.jpg" alt="Andreas Fertig: Embedded-Friendly C++: Features That Make a Difference - start-lifetime" /></p>

<h4 id="my-takeaway-8">My takeaway</h4>

<p>As always with Andreas, I was struck by how incredibly didactic and clear he is 🤩.<br />
His teaching style is calm, peaceful, and remarkably effective - a masterclass for any C++ trainer like me.</p>

<p>I especially appreciated how every feature was grounded in a real embedded need, showing not just what modern C++ offers, but why it matters in constrained environments.</p>

<p>Most - if not all - of the examples reminded me of code I’ve seen many times in peer-reviews.
In my experience, especially when related to the embedded world, contributors still tend to write old-style, error-prone code using patterns like <code class="language-plaintext highlighter-rouge">reinterpret-cast</code>, manual bit manipulations, index-based buffer manipulations, unions, and so on.</p>

<p>This coding style, in my view, often originates from legacy teaching approaches that are still widespread today. These approaches emphasize rigid rules, prescriptive “do and don’t” lists, katas, and patterns. When developers are taught only how to use a hammer, every problem inevitably starts to look like a nail.<br />
This results in two major issues: anchoring knowledge at some point in time rather than keep learning modern incoming features/techniques, and inhibating creativity, flexibility, and utimately pragmatism. This reduces software development to a simplistic pattern-matching exercise, where developers merely choose between predefined solutions instead of engaging in analysis, design, and trade-off evaluation.</p>

<p>The result is code - thus, PR - that is long, hard to read, difficult to maintain, and ultimately less safe and less reliable.</p>

<p>A few personal reflections:</p>

<ul>
  <li>Like always: <strong>contemporain C++ really simplifies</strong> codebases, including the ones related to embedded.<br />
Tasks that once required brittle tricks-casting bytes, parsing raw packets, converting enums-now have safe, standardized solutions.</li>
  <li>The combination of <code class="language-plaintext highlighter-rouge">std::span</code> + <code class="language-plaintext highlighter-rouge">std::expected</code> + <code class="language-plaintext highlighter-rouge">std::from-chars</code> is something I already promote at work. It’s such a clean way to handle raw data and error-cases.</li>
  <li>Compile-time features (<code class="language-plaintext highlighter-rouge">consteval</code>, <code class="language-plaintext highlighter-rouge">constinit</code>, <code class="language-plaintext highlighter-rouge">if</code>-<code class="language-plaintext highlighter-rouge">consteval</code>) offer a great way to enforce correctness without runtime cost.
    <ul>
      <li>I particularly appreciated the <code class="language-plaintext highlighter-rouge">if not consteval { std::println("", ...); }</code> trick that I’ll make sure to reuse, so I’ll extend my <code class="language-plaintext highlighter-rouge">constexpr</code> tests to functions that might emit logs and user-notifications.</li>
    </ul>
  </li>
  <li><code class="language-plaintext highlighter-rouge">std::unique-ptr</code> with <strong>custom deleters</strong> remains an easy and elegant bridge to legacy <code class="language-plaintext highlighter-rouge">C</code> APIs.</li>
</ul>

<p>I’ll make sure to dig into the presented features which I’m not familiar with yet, like <a href="https://en.cppreference.com/w/cpp/memory/start-lifetime-as.html">std::start-lifetime-as</a> and <a href="https://en.cppreference.com/w/cpp/types/has-unique-object-representations.html">std::has-unique-object-representations</a>.</p>

<p>I came away with several insights I can apply right away, and an even greater appreciation for Andreas’s teaching style. His approach genuinely inspired me to revisit my own training slide-decks, so I can make my courses more grounded in real-world needs and even more accessible; which might increase my <strong>trainings retention rate</strong>.</p>

<h3 id="️-daniela-engert---towards-safety-and-security-in-c26">🗣️ <strong>Daniela Engert</strong> - Towards Safety and Security in C++26</h3>

<p><a href="https://www.youtube.com/watch?v=mQI3B7ek9DU">🎥 Video</a>, <a href="https://github.com/DanielaE/Slides/blob/main/pdf/towards-safety-security-in-cpp-meetingcpp-2025.pdf">📄 slidedeck</a></p>

<p><em>Disclaimer: I chose to attend Daniela Engert’s talk instead of Evgenii Seliverstov’s *“Sanitize for your Sanity: Sanitizers tools for Modern C++”</em>, but I’ll definitely watch Evgenii’s session as soon as the recording becomes available.*</p>

<blockquote>
  <p>“Simplicity is a prerequisite for reliability”, <a href="https://en.wikipedia.org/wiki/Edsger-W.-Dijkstra">Edsger W. Dijkstra</a>.</p>
</blockquote>

<h4 id="content-1">Content</h4>

<p>Daniela’s session fit perfectly within this year’s recurring theme: <strong>tackling fears, misconceptions, and outdated beliefs</strong> about C++ being inherently unsafe. She grounded the discussion in real data: around 70% of <code class="language-plaintext highlighter-rouge">Microsoft</code>’s and <code class="language-plaintext highlighter-rouge">Chromium</code>’s CVEs come from memory safety issues, and the top CWE categories are exactly the usual out-of-bounds read/write access, use-after-free, null dereferences, integer overflows.</p>

<p>She reframed safety in its broad sense: memory safety, functional safety, system safety. And she walked through how contemporain C++ has been steadily strengthening its safety model.</p>

<p>Key points included:</p>

<ul>
  <li><strong>Undefined behaviors</strong> are everywhere (about 90 occurrences in language-specific part of the standard), but <strong>UBs exist for a reason</strong>: so compilers can optimize to generate faster instructions, not to punish developers.</li>
  <li><strong>Constant evaluation</strong> is becoming a cornerstone of safety: all UBs are detected and refused during constant evaluation.</li>
  <li><strong>C++ is getting safer with every standard</strong>, every 3 years. <code class="language-plaintext highlighter-rouge">constexpr</code> support keeps expanding (remember <a href="https://www.linkedin.com/in/hanicka/">Hana Dusikova</a> proposal last winter)</li>
  <li><strong>Standard library hardening (<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3471r4.html">P3471</a>)</strong> brings runtime-checked preconditions to the STL when enabled.</li>
  <li><strong>Trade-off: safety vs. performance</strong> - but if performance allows it, hardening is an immediate win.</li>
  <li><strong>Contract support &amp; partial program correctness (<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1494r5.html">P2900</a>)</strong> opens the door to precise diagnostics and better program correctness, coming with
    <ul>
      <li><code class="language-plaintext highlighter-rouge">pre</code>, <code class="language-plaintext highlighter-rouge">post</code>, and <code class="language-plaintext highlighter-rouge">contract-assert</code>,</li>
      <li>and policy/semantics like <code class="language-plaintext highlighter-rouge">ignore</code>, <code class="language-plaintext highlighter-rouge">observe</code>, <code class="language-plaintext highlighter-rouge">enforce</code>, and <code class="language-plaintext highlighter-rouge">quick-enforce</code>.</li>
    </ul>
  </li>
  <li><strong>Observable behavior &amp; checkpoints (P1494)</strong> prevent compilers from reordering checks in ways that could undermine contract guarantees.</li>
  <li><strong>Beyond C++26</strong>: profiles like <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3081r1.pdf">P3081 (Core safety profiles for C++26)</a> propose opt-in enforcement of type, bounds, lifetime and arithmetic, potentially moving C++ toward even safer subsets of the language.</li>
</ul>

<p>Overall, her talk showed a clear trajectory: the language and the standard library are evolving toward practical, opt-in safety - without abandoning performance.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/09-01-daniela-engert-towards-safety-and-security-in-cpp26-hardened-stl.jpg" alt="Daniela Engert: Towards Safety and Security in C++26 - MSVC hardened STL" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/09-02-daniela-engert-towards-safety-and-security-in-cpp26-contracts.jpg" alt="Daniela Engert: Towards Safety and Security in C++26 - contracts" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/09-03-daniela-engert-towards-safety-and-security-in-cpp26-contracts-semantic.jpg" alt="Daniela Engert: Towards Safety and Security in C++26 - contracts semantic" /></p>

<h4 id="my-takeaway-9">My takeaway</h4>

<blockquote>
  <p>Use constant-evaluation to detect UBs</p>
</blockquote>

<p>This talk reinforced a strong trend I’ve observed across Meeting C++ 2024: the community is actively <strong>challenging outdated narratives about C++ being “unsafe by nature”</strong>. Every new standard brings meaningful safety features, better diagnostics, and more predictable execution models.</p>

<p>👉 I’m particularly excited about <strong>contracts</strong>. I want to start integrating them into my daily work as soon as tooling and compilers stabilize - it’s exactly the kind of <strong>self-documenting</strong>, <strong>correctness-driven mechanism</strong> I’ve been waiting for, just like <code class="language-plaintext highlighter-rouge">concept</code>s before in another way <em>(like for constrained type-erasures / TEPS)</em>.</p>

<p>I’m also eager to learn more about <strong>STL hardening</strong>, because I suspect enabling it will reveal lots of subtle bugs hidden in many existing codebases: bugs that today manifest only as “mysterious UB”, and which are too often worked-around with dirty/questionable hot-fixes.</p>

<p>In truth, I almost have a kind of PTSD when it comes to undefined behavior 😨.<br />
Years ago - back when I was a junior developer -, I was involved in a project where a team spent nearly a full year chasing one particularly nasty UB issue (involving memory, concurrency, and AFAIR, some <a href="https://en.cppreference.com/w/cpp/language/siof.html">SIOF</a>).<br />
It delayed delivery, ramped up pressure on everyone, and left managers baffled - pushing for quick, superficial fixes instead of a real investigation 🤦‍♂️. Over and over again.<br />
There is a French expression that fits such a situation: <em>“confondre vitesse et précipitation”</em> (literally: mistaking haste for effectiveness).<br />
By the time a proper investigation was finally allowed and the full scope of the problem became clear, costs were already high and the organization’s credibility with the client was seriously at risk. At the time, I was still a junior developer, with only a limited understanding of the C++ standard. But that is a story for another day.</p>

<p>Seeing the direction C++ is currently taking when it comes to safety - contracts, profiles, hardened libraries, expanded constant evaluation support - makes me optimistic.<br />
Far from being an old unsafe language - <em>as the gossips and the ignorant says</em> - , C++ is steadily equipping developers with better tools to <strong>write safe, robust, modern software</strong>.</p>

<p>The beast keeps evolving to meet the need of the industry, and I can’t wait to see what’s coming next.<br />
This talk made that trajectory toward safety clearer than ever, and increased my appetite.</p>

<h3 id="️-raymi-klingers---25-years-of-pathfinding-problems-with-c">🗣️ <strong>Raymi Klingers</strong> - 25+ Years of pathfinding problems with C++</h3>

<p><a href="https://www.youtube.com/watch?v=lEBQveBCtKY">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/25+-Years-of-Pathfinding-Problems442903.pdf">📄 slidedeck</a></p>

<p>Raymi’s talk explored more than two decades of pathfinding challenges in the <a href="https://www.ageofempires.com/">Age of Empires</a> franchise <em>(among the games that most shaped my early interest in real-time strategy as a child)</em>, from the early <a href="https://en.wikipedia.org/wiki/Ensemble-Studios">Ensemble Studios</a> codebases to the modern remasters developed by <a href="https://www.forgottenempires.net/">Forgotten Empires</a>.</p>

<h4 id="content-2">Content</h4>

<p>It was a deep dive into how <a href="https://en.wikipedia.org/wiki/Pathfinding">pathfinding</a> systems evolve over time,<br />
especially when dealing with legacy code, performance constraints, and increasing community expectations.<br />
The talk compared different approaches used in major RTS/MOBA titles (AoE2, AoE3 DE, Age of Mythology, <a href="https://starcraft2.blizzard.com/en-us/">StarCraft II</a> 😍, <a href="https://www.leagueoflegends.com/">League of Legends</a>) and highlighted how each game tackles core issues such as:</p>

<ul>
  <li>pushing vs. non-pushing units</li>
  <li>bumping vs. non-bumping movement</li>
  <li>formation handling</li>
  <li>glitches like units clipping through walls</li>
  <li>overall pathfinding accuracy vs. performance tradeoffs</li>
</ul>

<p>Raymi walked through the multi-year process of fixing and improving AoE pathfinding:</p>

<ul>
  <li>intensive fuzz-testing to expose subtle bugs</li>
  <li>iterative bugfixing while ensuring no regressions</li>
  <li>dealing with floating-point precision loss (and adopting fixed-point to mitigate it)</li>
  <li>challenges with convex hull computations and complexity constraints</li>
  <li>the costliness of ray-tracing-based approaches</li>
</ul>

<p>It was also framed in the context of remastering/modernizing old codebases - balancing “don’t break the game the community loves” vs. “fix the long-standing problems players always complained about.”</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/10-raymi-klingers-25-years-of-pathfinding-problems-with-cpp.jpg" alt="Raymi Klingers: 25+ Years of pathfinding problems with C++ - The path of robustness" /></p>

<h4 id="my-takeaway-10">My takeaway</h4>

<p>Even though this talk was engaging - especially because I love simulations and game mechanics - it felt a bit rushed and dense to me <em>(despite tons of cool slides tho !)</em>, probably due to time constraints or stress.<br />
As a result, I couldn’t fully grasp the nuances of the thoughts, decision process and algorithms; but the development journey was still fascinating.</p>

<p>Pathfinding has always been a captivating topic to me: I’ve built many small simulations and games on my spare time, but I’ve often avoided using - thus, implementing - pathfinding because I felt underprepared, worried about designing something both correct and performant. Still, the talk reinforced how much I want to learn more about it.</p>

<p>It also made me reflect on how pathfinding shares conceptual similarities (even if loosely) with collision detection engines: spatial reasoning, constraints, approximations, and the “classic” tradeoff between accuracy and performance.</p>

<p>This talk definitely encouraged me to dig deeper into:</p>

<ul>
  <li>How large-scale games keep pathfinding predictable, stable, and maintainable</li>
  <li>The tradeoffs between precision and speed</li>
  <li>Historical/classic vs. modern pathfinding techniques</li>
  <li>How to make path-finding efficient yet testable</li>
  <li>Integrals vs. floating-point usage and strategies in performance-critical systems</li>
</ul>

<p>This is the fourth talk that has sparked/rekindled my urge to build new simulations or games. Resisting the temptation is getting harder each time 😅.</p>

<h2 id="-11082025">📅 11/08/2025</h2>

<h3 id="️-klaus-iglberger---the-real-problem-of-c">🗣️ <strong>Klaus Iglberger</strong> - The Real Problem of C++</h3>

<p><a href="https://www.youtube.com/watch?v=QmNkbUgADBE">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Klaus opened by addressing a harsh reality: major institutions such as the <a href="https://media.defense.gov/2023/Dec/06/2003352724/-1/-1/0/THE-CASE-FOR-MEMORY-SAFE-ROADMAPS-TLP-CLEAR.PDF">NSA</a>, the <a href="https://www.tomshardware.com/software/security-software/white-house-urges-developers-to-avoid-c-and-c-use-memory-safe-programming-languages">White House / ONCD</a> <em>(<a href="https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf">source not available anymore</a>)</em>, and the European Union (via the <a href="https://digital-strategy.ec.europa.eu/en/policies/cyber-resilience-act">Cyber Resilience Act</a>) have publicly claimed that C++ is not appropriate for developing safe softwares.<br />
Journalists amplified this message - <em>often <strong>conflating C and C++</strong> under the misleading “C/C++” label</em> - feeding an increasingly <strong>widespread belief</strong> that C++ is an <strong>unreliable and outdated</strong> language.<br />
For the record, C and C++ are respectively rated 2nd and 4th most used programming languages according to the <a href="https://www.tiobe.com/tiobe-index/">TIOBE index</a> in Jan. 2026.</p>

<p>Klaus’s position is clear: <strong>C++ is unsafe … if you are still writing C++ like back in 1998</strong>.</p>

<p>The real issue is not the language itself, but the mindset of many developers who do not leverage the modern features and tools introduced over the last ~30 years.</p>

<h4 id="safety-vs-performance-an-historical-tradeoff">Safety vs. performance: an historical tradeoff</h4>

<blockquote>
  <p><em>“C++ does not give you performance; it gives you control over performance.”</em>, Chandler Carruth.</p>
</blockquote>

<p>C++ always leaned toward performance when design tradeoffs had to be made.<br />
But modern C++ allows us to build safety on top of performance, while the other way around is not something intrinsically doable.</p>

<p>👉 We - as developers - must use that control wisely.</p>

<h4 id="bounds-safety">Bounds safety</h4>

<blockquote>
  <p><em>“If you want to improve code quality in your organization, I would say, take all your coding guideline and replace then with the one goal.</em>
<em>That’s how important I think this one goal is: <strong>No raw loops</strong>. This will make the biggest change in code quality with your organization”</em>, Sean Parent</p>
</blockquote>

<p>Klaus insists this is the biggest category of avoidable safety bugs. Raw loops are simply outdated, unsafe, thus should be avoided.</p>

<ul>
  <li>Prefer <code class="language-plaintext highlighter-rouge">std::ranges</code> and standards algorithms. If you are stuck with pre-C++20 for some reasons, then use the <a href="https://github.com/ericniebler/range-v3">range-v3</a> library.</li>
  <li>The key issue here is not a language problem: it’s <strong>resistance/reluctance to changing habits</strong>.</li>
</ul>

<p>Some peoples may have common misconceptions about using <code class="language-plaintext highlighter-rouge">ranges</code> over index-based for-loops: <em>“it’s difficult, it’s slow”</em>.<br />
They are <strong>wrong</strong>: it is not, and that’s what I call <strong>pragmatic simplicity</strong>. From your perspective, which of the following code is the most understandable for a non-developer ?</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// C++98 style</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">result</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
        <span class="n">result</span><span class="p">.</span><span class="n">push</span><span class="o">-</span><span class="n">back</span><span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="n">i</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"result: ["</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">result</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">result</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">result</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">?</span> <span class="s">""</span> <span class="o">:</span> <span class="s">", "</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"]</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
</code></pre></div></div>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// C++23 style</span>
<span class="k">auto</span> <span class="n">view</span> <span class="o">=</span> 
  <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">iota</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">filter</span><span class="p">(</span><span class="n">is</span><span class="o">-</span><span class="n">even</span><span class="p">)</span>
<span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">to</span><span class="o">-</span><span class="n">square</span><span class="p">)</span>
<span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">println</span><span class="p">(</span><span class="s">"result: {}"</span><span class="p">,</span> <span class="n">view</span><span class="p">);</span>
</code></pre></div></div>

<p>See the <a href="https://godbolt.org/z/r7vqWE8zz">demonstration here</a>.</p>

<p>😉 I notice such a resistance a lot when training developers, but ultimately they all come to understand that <strong>pragmatic simplicity is just better than pattern-recognition</strong>, for multiple reasons: less code, less bugs, easier-to-write and easier-to-maintain.</p>

<h4 id="undefined-behaviors-the-silent-killers">Undefined behaviors: the silent killers</h4>

<p>As Daniela Engert mentioned in a previous talk <em>(see the conference previous day, above)</em>, <code class="language-plaintext highlighter-rouge">UB</code>s appear ~90 times in the C++ standard, but it exists for a reason: it enables aggressive optimizations.</p>

<blockquote>
  <p><em>“Evaluation of a constant expression ([expr.const]) never exhibits behavior explicitly specified as undefined in <a href="https://eel.is/c++draft/intro">intro</a> through <a href="https://eel.is/c++draft/cpp">cpp</a>.”</em><br />
C++ standard, <a href="https://eel.is/c++draft/defns.undefined">3.65 [defns.undefined] undefined behavior</a></p>
</blockquote>

<p>However, modern C++ gives tools to catch UB early:</p>

<ul>
  <li>Undefined behaviors are not allowed at compile-time.</li>
  <li>Make as much code as possible <code class="language-plaintext highlighter-rouge">constexpr</code>.</li>
  <li>Use <code class="language-plaintext highlighter-rouge">consteval</code> for tests: <code class="language-plaintext highlighter-rouge">static-assert(test())</code>.</li>
  <li>Test both compile-time and runtime paths.</li>
</ul>

<p>👉 As constexpr support expands each standard cycle, the space for UB keeps shrinking.</p>

<h4 id="type-safety-through-strong-types">Type safety through strong types</h4>

<p>Many bugs come from:</p>

<ul>
  <li>Swapped function arguments</li>
  <li>Implicit conversions</li>
  <li>Narrowing conversions</li>
</ul>

<p><strong>Strong types</strong> solve this elegantly:</p>

<ul>
  <li><a href="https://clang.llvm.org/extra/clang-tidy/checks/google/explicit-constructor.html">explicit constructors</a></li>
  <li>type constraints (<code class="language-plaintext highlighter-rouge">std::same-as</code>)</li>
  <li>libraries like <a href="https://github.com/rollbear/strong-type">rollbear/strong-type</a>, <a href="https://github.com/foonathan/type-safe">foonathan/type-safe</a>, and <a href="https://github.com/mpusz/mp-units">mp-units</a>.</li>
</ul>

<p>Same performance, significantly safer. That’s what such zero-cost abstractions are all about.</p>

<h4 id="lifetime-safety-value-semantics-over-inheritance">Lifetime safety: value semantics over inheritance</h4>

<p>Classic/legacy dogmatic <a href="https://en.wikipedia.org/wiki/Object-oriented-programming">OOP</a> design in C++ leads to:</p>

<ul>
  <li>pointer-heavy code</li>
  <li>dynamic allocations</li>
  <li>virtual calls / vtables</li>
  <li>complex lifetime management</li>
</ul>

<p>Klaus emphasized that value semantics should be our default, which echoes with his previous talks like <a href="https://www.youtube.com/watch?v=pmdwAf6hCWg">C++ Design Patterns - The Most Common Misconceptions (2 of N) - CppCon 2024</a>.</p>

<p>For instance, <code class="language-plaintext highlighter-rouge">std::variant</code> can replace entire inheritance hierarchies:</p>

<ul>
  <li>no base classes</li>
  <li>no raw pointers</li>
  <li>no virtual dispatch</li>
  <li>fewer allocations</li>
  <li>safer code, simpler lifetime management</li>
</ul>

<p>This captures the spirit of the “modern C++” mindset.<br />
👉 But it’s worth adding a nuance: the goal is <strong>not</strong> to replace <strong>one blindly followed dogma</strong> with another.</p>

<p>Speaking of value semantic, I noticed that C++26 comes with <a href="https://en.cppreference.com/w/cpp/memory/polymorphic.html">std::polymorphic</a> and <a href="https://en.cppreference.com/w/cpp/memory/indirect.html">std::indirect</a> to help promote value semantic.<br />
See <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3019r12.pdf">p3019 - indirect and polymorphic: Vocabulary Types for Composite Class Design</a></p>

<h4 id="conclusion-the-real-problem-is-a-people-problem">Conclusion: the real problem is a <strong>people problem</strong></h4>

<blockquote>
  <p><em>“No matter what the problem is, it’s always a people problem.”</em> - Gerald M. Weinberg</p>
</blockquote>

<p>Klaus closed with one of the strongest messages of the whole conference:</p>

<ul>
  <li>Millions of C++ developers don’t keep up with modern practices.</li>
  <li>Many still write 1990s-style C++ and then blame the language.</li>
  <li>Meanwhile, misinformation spreads loudly on social media.</li>
</ul>

<p>His point was not to shame developers, but to remind the experts - us - to teach, mentor, write, and correct misconceptions.<br />
👉 If we don’t, loud voices will drive the narrative, not factual ones.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/11-01-klaus-iglberger-the-real-problem-of-cpp.jpg" alt="Klaus Iglberger: The Real Problem of C++ - my personnal opinion" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/11-02-klaus-iglberger-the-real-problem-of-cpp.jpg" alt="Klaus Iglberger: The Real Problem of C++ - expert's opinion" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/11-03-klaus-iglberger-the-real-problem-of-cpp.jpg" alt="Klaus Iglberger: The Real Problem of C++ - current state of discussion" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/11-04-klaus-iglberger-the-real-problem-of-cpp.jpg" alt="Klaus Iglberger: The Real Problem of C++ - about reference semantic" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/11-05-klaus-iglberger-the-real-problem-of-cpp.jpg" alt="Klaus Iglberger: The Real Problem of C++ - conclusion" /></p>

<h4 id="my-takeaway-11">My takeaway</h4>

<p>I’ve always admired Klaus’s teaching style: deeply pragmatic, calm, rational, and laser-focused on <strong>facts over dogmas</strong>.<br />
He questions sacred cows, re-evaluates assumptions, and isn’t afraid to challenge outdated habits.<br />
👉 That resonates strongly with my own philosophy as a trainer: break beliefs, fight misconceptions, and replace them with practical, evidence-based reasoning.</p>

<p>This talk felt perfectly aligned with the overall implicit “safety” theme of this year’s conference. It tackled the elephant in the room head-on by naming the NSA, the White House, and the EU’s <em>“C++ is unsafe”</em> claims.<br />
Honestly, <strong>I’m fed up <em>(no pune intended)</em> with this narrative</strong>, that is leading to some kind of a panick feeling among lots of my peers, but also managers and tech-leads.<br />
😒 And especially when it’s fueled by shallow takes, buzzwords, and biased/bad/malicious analogies.</p>

<p>This strongly echoes with the amazing MeetingCpp 2024 closing keynote <a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669#%EF%B8%8F-peter-sommerlad-collective-amnesia">“Collective Amnesia ?”, from Peter Sommerlad</a>, in which he warned the audience against trend-driven/cargo-cult decision-makers, as well as simplistic solutions, ignorance and lack of pragmatism in general.</p>

<p>Klaus reminded me that safety in C++ is not a pipe dream. It’s achievable today if we adopt modern techniques:</p>

<ul>
  <li>ranges over raw loops</li>
  <li>strong types everywhere</li>
  <li><code class="language-plaintext highlighter-rouge">constexpr</code> and <code class="language-plaintext highlighter-rouge">consteval</code> to eliminate UBs</li>
  <li>value semantics as a default</li>
  <li>variants over inheritance</li>
  <li>using tools, sanitizers, static analyzers, <a href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines">guidelines</a>.</li>
</ul>

<p>His talk strengthened my belief that the real issue is not the language - it’s the collective mindset. And as someone who keeps learning, attending conferences, reading papers, and teaching, I’m part of the group that must mentor others.</p>

<p>If we - <em>those who stay up-to-date</em> - share our knowledge, challenge dogma, and counter misinformation, the <em>“C++ is unsafe”</em> rhetoric will fade. If we don’t, we leave the floor to uninformed opinions.</p>

<p>This talk rekindled my motivation to teach contemporain, safe C++; to fight bullshit wherever it comes from - old university teachings, trends, buzzwords, or social-media spread myths - and to push for a community that <strong>values evidence and pragmatism over beliefs and dogmas</strong>.</p>

<p>👉 From my perspective, the C++ #1 strengh is its <a href="https://eel.is/c++draft/">standard</a> - the <strong>ultimate, formal source of thruth</strong>.<br />
However, most C++ developers don’t even know it exists, and favor unreliable sources such as LLMs, forums, SO, etc.</p>

<p>Klaus delivered one of the clearest and most impactful messages of the entire conference, and I’m genuinely grateful for it.<br />
He concluded with a call to action:</p>

<ul>
  <li>We must <strong>keep improving the language</strong> so that writing <strong>safe code becomes easier</strong>.</li>
  <li>We must <strong>communicate and educate</strong> more effectively about <strong>how to write C++ properly</strong>.</li>
</ul>

<h4 id="additional-sources">Additional sources</h4>

<ul>
  <li>
    <table>
      <tbody>
        <tr>
          <td><a href="https://media.defense.gov/2023/Dec/06/2003352724/-1/-1/0/THE-CASE-FOR-MEMORY-SAFE-ROADMAPS-TLP-CLEAR.PDF">The Case for Memory Safe Roadmaps - Why Both C-Suite Executives and Technical Experts Need to Take Memory Safe Coding Seriously</a>, December 2023, CISA</td>
          <td>NSA</td>
          <td>FBI</td>
          <td>ASD’s ACSC</td>
          <td>CCCS</td>
          <td>NCSC-UK</td>
          <td>NCSC-NZ</td>
          <td>CERT-NZ.</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li>
    <table>
      <tbody>
        <tr>
          <td><a href="https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI-SOFTWARE-MEMORY-SAFETY.PDF">Software Memory Safety</a>, April 2023, National Security Agency</td>
          <td>Cybersecurity Information Sheet.</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li><a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669#%EF%B8%8F-peter-sommerlad-collective-amnesia">Peter Sommerlad - “Collective Amnesia ?” - Meeting Cpp 2024</a></li>
</ul>

<h3 id="️-roth-michaels---how-to-become-obsolete-a-guide-to-software-engineering-mentorship">🗣️ <strong>Roth Michaels</strong> - How to become obsolete: a guide to software engineering mentorship</h3>

<p><a href="https://www.youtube.com/watch?v=CR84TWbvXDQ">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Roth framed his talk around a question we - <em>experienced engineers</em> - all eventually face: How to lead effectively, share knowledge, yet still avoid being the bottleneck ?<br />
The talk was heavily inspired by Meeting C++ 2024 themes (<a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669#%EF%B8%8F-titus-winters-opening-keynote---fear-in-tech">Titus Winters on “Fear in C++”</a>, <a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669#%EF%B8%8F-kate-gregory-the-aging-programmer">Kate Gregory on “Aging Developers”</a>), and tied to Roth own experience at <a href="https://www.native-instruments.com/en/">Native Instruments</a>.<br />
The central metaphor was <a href="https://en.wikipedia.org/wiki/Free-jazz">free jazz</a> - a style built on improvisation, shared leadership, and trust, but also breaking conventions, to get rids of limitations in order to promote creativity.</p>

<h4 id="why-become-obsolete-">Why become obsolete ?</h4>

<p>The goal of a senior engineer or tech-lead should not be to remain indispensable forever. If the team relies on you for every decision, you will never move on to new opportunities, and the team will never grow.<br />
👉 In free jazz terms: you’re not the conductor - you’re another musician in the ensemble.</p>

<p>Becoming “obsolete” means that:</p>

<ul>
  <li>You’ve successfully <strong>shared leadership</strong></li>
  <li>The team can run without you</li>
  <li>You’ve built <strong>resilient structures for decision-making</strong></li>
</ul>

<p>And when that happens, you gain the space to breathe and ask to yourself : “What’s the next important thing I can achieve/work on now ?”</p>

<h4 id="shared-technical-leadership">Shared technical leadership</h4>

<p>Roth emphasized <strong>pair-leadership</strong>, similar to pair-programming but applied to ownership of systems, architectures, and projects directions.<br />
👉 This promotes resilience and stability among the team. Two leaders <strong>share responsibilities</strong>:</p>

<ul>
  <li>Project oversight</li>
  <li>Architectural decisions</li>
  <li>Reviewing code</li>
  <li>Offering technical expertise</li>
</ul>

<p>This ensures that if one person is unavailable at a moment (sick or on vacation) then <strong>nothing falls apart</strong>.<br />
Knowledge redundancy is a leadership achievement.</p>

<p><strong>Mentorship</strong> must be part of the <strong>onboarding process</strong>: new hires should pair with experienced peoples, to be shown:</p>

<ul>
  <li>What the <strong>project’s architecture</strong> is</li>
  <li>How the <strong>codebase is organized</strong></li>
  <li>What the <strong>guidelines</strong>, <strong>principles</strong> and <strong>best-practices</strong> are</li>
  <li>Be taught thought <strong>processes</strong> - not just tasks (<strong>decision-making</strong>, weightening <strong>trade-offs</strong>, etc.)</li>
</ul>

<h4 id="identifying-and-developing-leaders">Identifying and developing leaders</h4>

<p>👉 Roth insisted that true leadership often lies in reluctant leaders, not the loudest voices.<br />
Technical leadership should not be exclusive to extroverts or natural talkers, but instead:</p>

<ul>
  <li>Find subject-matter experts</li>
  <li>Observe quiet but thoughtful engineers</li>
  <li>Rotate projects leaderships</li>
  <li>Every project can (and should) have a different project lead.</li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/12-ruth-michaels-how-to-gbecome-obsolete.jpg" alt="Roth Michaels: How to become obsolete: a guide to software engineering mentorship - identifying leaders" /></p>

<h4 id="practical-mentorship-techniques">Practical mentorship techniques</h4>

<p>Some key practices Roth highlighted:</p>

<h5 id="sharing-knowledge">Sharing knowledge</h5>

<ul>
  <li>Wikis usually fail: too long to write, rarely read -&gt; not cost-effective</li>
  <li><strong>Answer questions publicly</strong>, not in private channels</li>
  <li>Organize live discussions for design decisions -&gt; collective intelligence</li>
  <li>Direct questions to subject-matter experts</li>
  <li>Provide references, not only answers -&gt; formal sources of truth</li>
</ul>

<h5 id="talking-through-engineering-problems-asking-them">Talking through engineering problems, asking them</h5>

<ul>
  <li>What is the actual problem?</li>
  <li>What is your thinking?</li>
  <li>Why is this a good - or bad - idea?</li>
</ul>

<blockquote>
  <p>💡 And <strong>be transparent about the strength of your ideas</strong>: some are strong, some are half-baked.</p>
</blockquote>

<p>👉 Leaders’ opinions carry lots of weight; they must communicate uncertainty clearly.</p>

<h5 id="pair-debugging-is-an-incredibly-powerful-teaching-tool">Pair-debugging is an incredibly powerful teaching tool</h5>

<ul>
  <li>Ask “show it to me in the debugger”</li>
  <li>Place breakpoints, watchpoints</li>
  <li>Explore the state together</li>
</ul>

<blockquote>
  <p>💡 It lets you teach not only the solution, but your whole investigation and decision-making process.</p>
</blockquote>

<h5 id="code-reviews-differenciate-types-of-comments">Code-reviews: differenciate types of comments</h5>

<ul>
  <li>Neat suggestions</li>
  <li>Educational remarks</li>
  <li>Blockers / must-fix</li>
</ul>

<blockquote>
  <p>⚠️ He also warned about “LGTM anxiety”: is it genuine approval or avoidance ? When code is complex (TMP, concurrency, etc.), do live walkthroughs, but remain aware of the bias risk (e.g false sense of understanding).</p>
</blockquote>

<h5 id="encourage-psychological-safety">Encourage psychological safety</h5>

<p>Roth advocates <strong>bragging about mistakes</strong>, reminding me of the <strong><em>“monkey of the week”</em></strong> practice, which is encouraging your ICs to laugh about their own mistake - in a public channel, during sprint retrospective, etc.</p>

<p>👉 Teams need a culture where failure is acceptable and even encouraged as a learning mechanism.</p>

<blockquote>
  <p>💡Leadership = vulnerability + openness + candor.</p>
</blockquote>

<h4 id="qa">Q&amp;A</h4>

<p>I had the opportunity to ask about presenting complex PRs (TMP, concurrency, multi-threading, etc.) without biasing reviewers.<br />
Roth’s answer was straightforward:</p>

<ul>
  <li>A reviewer must understand <strong>every</strong> part of the PR.</li>
  <li>If they don’t, they should ask and learn.</li>
  <li>If people don’t understand a pattern or technics, then write/share minimal examples to teach it to others.</li>
</ul>

<p>As a lead developer, I have often seen contributors schedule <em>“PR presentation”</em> sessions with me. While well-intentioned, these meetings can - <em>from my perspective/experience</em> - create a <strong>false sense of shared understanding</strong> and <strong>introduce additional pressure</strong> to approve the change quickly, often in order to meet deadlines or delivery milestones.</p>

<p>I eventually decided to discourage such meetings altogether, as they too often left me with the discomfortable impression that I had agreed to a change without fully scrutinizing it. In several cases, this resulted in bug-prone and/or hard-to-maintain code making its way into the codebase-despite an apparent consensus reached during the discussion.</p>

<p>These meetings were replaced with design and/or implementation strategy sign-offs, during which developers present their intended approach (for example, how they plan to design a feature or resolve an issue).<br />
Once the pull request is submitted, a follow-up discussion takes place to assess the result and to analyze any delta between the original intent/promise and the final result.</p>

<h4 id="my-takeaway-12">My Takeaway</h4>

<p>This talk hit close to home for me, because mentorship and technical leadership have become a growing part of my own work.</p>

<p>I loved how humble and empathic Roth was, and how his analogy with free jazz was relevant: guiding without dictating, structuring without suppressing creativity, and enabling others to improvise confidently.<br />
His emphasis on becoming “obsolete” is something I strongly believe in: leadership isn’t about centralizing authority, but about distributing it so the team can thrive even without you.</p>

<p>👉 Unfortunately, this ideal is often contrasted sharply by what we see in practice.<br />
Too many leaders - <em>especially managers</em> - lacking technical understanding still impose ill-informed decisions with little or no justification.<br />
This kind of unilateral, arbitrary behavior echoes the textbook definition <strong>fascism</strong>: an authoritarian, arbitrary, and imposing attitude exerted by an individual over a group.<br />
👉 Leadership and respect should not be asserted, but <strong>earned</strong> by demonstrating kindness, guidance, and mentorship.</p>

<p>His point about <strong>reluctant leaders</strong> resonated particularly deeply. In many teams, the loudest voices dominate by default, while some of the most thoughtful, reliable, and technically insightful engineers are quieter. Identifying and nurturing them is a huge multiplier for team health.<br />
👉 Extroverts who like to brag and to tell stories are too often favored, to the detriment of competent introverts.</p>

<blockquote>
  <p>💡 Related to this, I recently had the opportunity to discuss what could be described as <em>courtier/courtesan/sycophant</em> roles: ambitious individuals who are highly articulate, socially adept, and well-regarded by top-level management, yet whose influence is primarily <strong>performative rather than grounded in technical reality</strong>.</p>

  <p>By <strong>overpromising outcomes</strong>, <strong>underestimating complexity</strong>, or presenting an <strong>overly optimistic view of feasibility and timelines</strong>, they create a <strong>false sense of shared understanding</strong> at the management level.<br />
This, in turn, translates into <strong>unrealistic expectations</strong>, compressed deadlines, and <strong>sustained pressure</strong> on engineering teams.<br />
Despite being frequently rewarded and promoted for their apparent effectiveness, such behavior is ultimately detrimental to project delivery, team morale, and long-term trust.</p>
</blockquote>

<p>I also appreciated his very pragmatic mentoring techniques: pair-debugging, public Q&amp;A/AMAs, tackle uncertainty, and using discussions as a way to transmit thinking patterns, not just decisions.<br />
From my perspective, building a <strong>shared/common understanding</strong> of a project’s vision/goal, philosophy, architecture, but also tradeoffs, milestones, and constraints is a key to achieving success.</p>

<blockquote>
  <p>💡 To use nautical metaphor, a software team is much like a ship’s crew.<br />
When the crew does not know where the vessel is headed, does not trust the captain, or is not given a clear course - its destination, waypoints, and the reasons behind the journey - even the most skilled sailors will struggle. Effort becomes fragmented, initiative fades, and progress turns erratic.</p>

  <p>Conversely, when the destination is explicit, the route is understood, and leadership is trusted,<br />
then each member of the crew can act with confidence and autonomy. In such conditions, individual expertise compounds rather than conflicts, and the ship advances steadily toward its goal, even in rough seas.</p>
</blockquote>

<p>Overall, the talk was refreshing, human, and deeply practical: a reminder that leadership is less about the cult of personnality, and more about <strong>creating ecosystems where others can grow</strong>, take ownership, and eventually replace you.</p>

<h3 id="️-kerstin-keller---why-managing-c-dependencies-is-hard-and-what-to-do-about-it">🗣️ <strong>Kerstin Keller</strong> - Why managing C++ dependencies is hard (and what to do about it)</h3>

<p><a href="https://www.youtube.com/watch?v=fDXtQOEtrbw">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>With this talk, <a href="https://meetingcpp.com/2024/Speaker/items/Kerstin-Keller.html">Kerstin Keller</a> (<a href="http://www.aumovio.com/en.html">AUTOMOVIO</a>) discussed why C++ dependency management is uniquely difficult, and how modern tools - and <a href="https://conan.io/">Conan</a> in particular - can help.<br />
This is a nice addition to her talk back at Meeting Cpp 2024 <a href="https://www.youtube.com/watch?v=k76LN8dSxx4">Clean CMake for C++ (library) developers</a>.</p>

<p>Dependency management matters because most - <em>if not, all</em> - projects rely on many external components,<br />
but keeping everything portable, compatible and scalable is a non-trivial challenge.</p>

<p>She began by explaining that dependencies are usually extracted outside the main repository: projects combining their own code with the full source of all external libraries would simply be too big.</p>

<h4 id="what-are-dependencies--what-is-dependency-management-">What are dependencies &amp; what is <strong>dependency management</strong> ?</h4>

<p>A <strong>dependency</strong> is any external component (library, framework, module, service…) required to compile or run.<br />
<strong>Dependency management</strong> is about orchestrating these components across versions, environments, and build configurations.</p>

<p>Semantic <strong>versioning</strong> <em>(<code class="language-plaintext highlighter-rouge">major.minor.patch</code>)</em> is a contract between library authors and users, and reproducible builds require consistent source, environment, and instructions.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/13-00-kerstin-keller-why-managing-cpp-dependencies-is-hard-graph.jpg" alt="Kerstin Keller: Why managing C++ dependencies is hard - dependency graph" /></p>

<h4 id="how-developers-handle-dependencies-nowadays-">How developers handle dependencies nowadays ?</h4>

<ul>
  <li>Source-based vendoring (copying the dependency into the repo) -&gt; not scalable, too heavy, hard to update</li>
  <li>Build-system-based (like <a href="https://cmake.org/cmake/help/latest/module/FetchContent.html">CMake’s FetchContent</a>)</li>
  <li>Dependency managers (<a href="https://conan.io/">Conan</a>, <a href="https://vcpkg.io/">vcpkg</a>, <a href="https://hunter.readthedocs.io/">Hunter</a>, <a href="https://github.com/biicode/biicode">Biicode</a>, etc. that are still rarely used in C++ projects)</li>
  <li>System packages (Linux distros, like <code class="language-plaintext highlighter-rouge">apt</code>, <code class="language-plaintext highlighter-rouge">yum</code>, etc.)</li>
</ul>

<blockquote>
  <p>💡 Conan feels great</p>
</blockquote>

<p>Dependency managers help solve multi-version graphs, transitive dependencies, and mismatched constraints.</p>

<blockquote>
  <p>💡 Pin major versions, avoid broad ranges.</p>
</blockquote>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/13-01-kerstin-keller-why-managing-cpp-dependencies-is-hard-survey.jpg" alt="Kerstin Keller: Why managing C++ dependencies is hard - survey" /></p>

<h4 id="why-c-dependencies-management-is-unique-and-hard-">Why C++ dependencies management is unique and hard ?</h4>

<p>Three main challenges:</p>

<ul>
  <li>
    <p><strong>Binary compatibility</strong>: When is an existing package safe to reuse ?<br />
Tools compute a package ID hash (compiler, options, build settings) to detect <strong>ABI compatibility</strong>.</p>
  </li>
  <li>
    <p><strong>No standard build system</strong>: C++ projects use <a href="https://cmake.org/">CMake</a>, <a href="https://mesonbuild.com/">Meson</a>, <a href="https://bazel.build/">Bazel</a>, custom/hands-written <a href="https://www.gnu.org/software/make/manual/html-node/Introduction.html">Makefile</a>s, etc.<br />
<a href="https://docs.conan.io/2/integrations.html">Conan integration</a> supports most.</p>
  </li>
  <li>
    <p><strong>No standard package format</strong>: Different ecosystems lack a shared way to describe installable artifacts.<br />
👉 The proposed solution: <a href="https://cps-org.github.io/cps/overview.html">CPS (Common Package Specification)</a> - a JSon-based declarative description of how packages may <strong>easily</strong> consume each others, from a <strong>build</strong> perspective.</p>

    <blockquote>
      <p>💡 Both <a href="https://www.kitware.com/navigating-cmake-dependencies-with-cps/">CMake</a> and <a href="https://mesonbuild.com/">Meson</a> are experimenting with <a href="https://cps-org.github.io/cps/overview.html">CPS</a> support.</p>
    </blockquote>
  </li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/13-02-kerstin-keller-why-managing-cpp-dependencies-is-hard-dependency-manager-purpose.jpg" alt="Kerstin Keller: Why managing C++ dependencies is hard - dependency manager purpose" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/13-03-kerstin-keller-why-managing-cpp-dependencies-is-hard-providing-dependencies.jpg" alt="Kerstin Keller: Why managing C++ dependencies is hard - providing dependencies" /></p>

<h4 id="inputs-from-the-qa">Inputs from the Q&amp;A</h4>

<ul>
  <li><a href="https://docs.conan.io">Conan</a> integrates well with <a href="https://jfrog.com/artifactory">JFrog Artifactory</a>.</li>
  <li><a href="https://github.com/cpm-cmake/CPM.cmake">CMake Package Manager (CPM)</a> still operates at the build-source level, not binary level.</li>
  <li><code class="language-plaintext highlighter-rouge">Conan</code> vs <code class="language-plaintext highlighter-rouge">vcpkg</code>: <code class="language-plaintext highlighter-rouge">Conan</code> supports binary packages out of the box, reducing build times for large dependency graphs.</li>
  <li><code class="language-plaintext highlighter-rouge">Conan</code> profiles can live in a central <code class="language-plaintext highlighter-rouge">Git</code> repository.</li>
  <li><a href="https://docs.conan.io/2/reference/tools/cmake/cmaketoolchain.html">Conan can generate CMake toolchain files</a>.</li>
</ul>

<h4 id="my-takeaway-13">My Takeaway</h4>

<p>In a nutshell:</p>

<ul>
  <li>Dependencies form complex <strong>graphs</strong>; dependency managers automate retrieval and updates.</li>
  <li><strong>Lockfiles</strong> are essential for reproducible builds.</li>
  <li>Some may complain about the C++ ecosystem lacking a standardized packaging and build tooling, which might make dependency managers harder to implement.</li>
  <li><a href="https://cps-org.github.io/cps/overview.html">Common Package Specification (CPS)</a> is a promising cross-tooling package description format the community should support.</li>
  <li>👉 Use <code class="language-plaintext highlighter-rouge">Conan</code>.</li>
</ul>

<p>I spend a lot of time building resilient/reliable, portable, modular C++ systems <em>(including some with <a href="https://www.ros.org/">ROS</a> !)</em>, and dependency management is often a central pain point.</p>

<p>From my perspective, this talk evangelized strongly about <em>“just use Conan”</em>, but this seems to be a strong and realistic tool to tackle dependency-management related issues nowadays <em>(ABI compatibility, package format standardisation, and build systems homogeneosity, etc.)</em>.</p>

<p>Honestly, I mostly use <a href="https://cmake.org/cmake/help/latest/module/FetchContent.html">CMake’s FetchContent</a>. Sometime with a front built on top to promote consistency and a better API: <a href="https://github.com/cpm-cmake/CPM.cmake">CPM</a> or a homemade one.<br />
And it works not too bad: sure, fetching takes time, but then most of my projects take from a fistful of seconds up to 2 minutes to build, even larger ones. Especially because nowadays, most C++ libraries are - or offer some variants as (like <a href="https://github.com/fmtlib/fmt">fmt</a> with <code class="language-plaintext highlighter-rouge">FMT-HEADER-ONLY</code>) - header-only.</p>

<blockquote>
  <p>👉 Although, I like A LOT the idea of just pressing the <code class="language-plaintext highlighter-rouge">build</code> button in my IDE, and let the project(s) take care of its dependency tree all by itself.<br />
Attempting to use, build or contribute to some GitHub projects still often devolves into an iterative cycle of missing dependencies, manual installation, and repeated build failures.</p>
</blockquote>

<p>From my experience, still too many companies often manage dependencies with a mix of:</p>

<ul>
  <li>Embbed everything in a <code class="language-plaintext highlighter-rouge">Docker</code> (dev)container using the OS package-mananagers (<code class="language-plaintext highlighter-rouge">apt</code>, <code class="language-plaintext highlighter-rouge">yum</code>, etc.).</li>
  <li><code class="language-plaintext highlighter-rouge">git</code> submodules</li>
  <li>copy-pasted files directly in the source tree 🤢</li>
  <li>CMake <a href="https://cmake.org/cmake/help/latest/module/FetchContent.html">FetchContent</a> and/or <a href="https://cmake.org/cmake/help/latest/command/file.html#transfer">file(DOWNLOAD …)</a>.</li>
</ul>

<p>The <code class="language-plaintext highlighter-rouge">CPS</code> part was especially insightful, as I was not aware of such an initiative: C++ desperately needs a unified package description, and hearing that <code class="language-plaintext highlighter-rouge">CMake</code> and <code class="language-plaintext highlighter-rouge">Meson</code> are converging on something concrete is encouraging.</p>

<p>Overall, I came out with a clearer overall picture of why dependency managers in C++ feel so rough, why I often struggle with it, and how the ecosystem might evolve in a - <em>hopefully, near</em> - future.<br />
It’ll also make sure to give <code class="language-plaintext highlighter-rouge">Conan</code> a decent try when I’ll have the opportunity !</p>

<h4 id="additional-resources-1">Additional resources</h4>

<ul>
  <li><a href="https://github.com/cps-org/cps-config">A drop in replacement for pkg-config/pkgconf using cps files</a></li>
  <li><a href="https://www.youtube.com/watch?v=IwuBZpLUq8Q">CppCon 2023 - Libraries: A First Step Toward Standard C++ Dependency Management - Bret Brown &amp; Bill Hoffman</a></li>
  <li><a href="https://www.youtube.com/watch?v=ZTjG8fy6Bek">CppCon 2023 - A Common Package Specification: Getting Build Tools to Talk to Each Other - Lessons Learned</a></li>
</ul>

<h3 id="️-jens-weller---meeting-c-update">🗣️ <strong>Jens Weller</strong> - Meeting C++ update</h3>

<p><a href="">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Like every year, Jens Weller shared a transparent update on the state of <code class="language-plaintext highlighter-rouge">Meeting C++</code>, and the broader conference ecosystem.</p>

<p>While the conference reaches nearly <strong>100000 online visitors</strong> compared to about <strong>230 onsite attendees</strong>, 2025 has been economically challenging: frozen training budgets, fewer committed sponsors, and rising fixed costs - especially for hybrid events hosted in high-quality venues.<br />
Despite this, Meeting C++ is still standing after <strong>13 years</strong>, this iteration being described by Jens as <em>“the best conference in the worst year”</em>, though just barely breaking even. Jens was clear: <strong>the conference must continue to evolve &amp; adapt</strong>, as running it the same way has become too risky.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/14-01-jens-weller-meeting-cpp-update-survey.jpg" alt="Jens Weller: Meeting C++ update - survey" /></p>

<h4 id="whats-next-">What’s next ?</h4>

<p>Meeting C++ has already diversified significantly to stay sustainable: online shops (<a href="https://meetingcpp.myspreadshop.de">hoodies and tshirts</a>, and <a href="https://meetingcpp.etsy.com">calendars</a>), fund-raising initiatives, paid services (trainings, code reviews), live and pre-recorded talks, <a href="https://meetingcpp.com/mcpp/online/jobfair.php">job fairs</a>, <a href="https://meetingcpp.com/mcpp/user/register.php">newsletters</a>, <a href="https://meetingcpp.com/blog/">blogs</a>, <a href="https://meetingcpp.com/blog/blogroll/">blogroll</a>, and experiments with new online formats like AMAs, livestreams, and speaker interviews (check the <a href="https://www.youtube.com/@MeetingCPP">youtube channel</a>).</p>

<p>Jens also emphasized the foundational role of C++ user groups, which were key to launching Meeting C++ in the first place and remain central to its mission-supporting new groups, sharing their events, and connecting local C++ communities.</p>

<h4 id="2026-conference">2026 conference</h4>

<p>The next Meeting C++ conference is planned for November 26-28 2026, again in Berlin (<a href="https://www.wyndhamhotels.com/vienna-house/berlin-germany/vienna-house-andels-berlin/rooms-rates?brand-id=VI&amp;checkInDate=11%2F26%2F2026&amp;checkOutDate=11%2F28%2F2026&amp;useWRPoints=false&amp;children=0&amp;adults=1&amp;rooms=1">Andel Hotel</a>), with both onsite and online participation.<br />
Jens encouraged attendees to support the conference early by buying tickets sooner in future years.<br />
The update closed with heartfelt thanks to sponsors, volunteers, speakers, and attendees, and the C++ community.</p>

<h4 id="hommage-to-rainer-grimm">Hommage to Rainer Grimm</h4>

<p>The update ended with an unplanned, emotional homage paid to <a href="https://www.modernescpp.com/">Rainer Grimm</a>, who recently <a href="https://www.modernescpp.com/index.php/my-als-journey-31-31-the-end/">passed away</a> from <a href="https://www.als.org/understanding-als">ALS (amyotrophic lateral sclerosis)</a>, possibly linked to (long) Covid.<br />
Jens also shared the symbolic journey of <a href="https://www.modernescpp.org/cippi-is-very-concerned-about-rainer/">Cippi</a> the puppet accompanying Klaus Iglberger to conferences around the world, keeping Rainer’s memory alive within the C++ community.</p>

<p>👉 Go check <a href="https://www.modernescpp.org/category/project-cippi/">Cippi’s blog</a> !</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/14-02-jens-weller-meeting-cpp-update-cippi-and-rainer.jpg" alt="Jens Weller: Meeting C++ update - Cippi and Rainer" /><br />
<em>(I put this screenshot twice on purpose)</em></p>

<h3 id="lightning-talks">⚡Lightning talks</h3>

<h4 id="-james-mcnellis-our-most-teacherous-adversary">⚡ <strong>James McNellis</strong> Our most teacherous adversary</h4>

<p><a href="https://www.youtube.com/watch?v=zC-uwGqSLqQ">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>James humorously reminded us that as C++ developers, we sometime over-trust compilers, which might break our code whenever the standard allows them to.<br />
His example with <code class="language-plaintext highlighter-rouge">bool</code> illustrated how seemingly harmless types can behave unpredictably across privilege or ABI boundaries.</p>

<p>To my knowledge, <code class="language-plaintext highlighter-rouge">bool</code> suffers from an unstable, implementation-defined representation - as the C++ standard does not fix how it is represented in memory. It just may vary across compilers and plateforms, from 1 byte as bit value (0 or 1), 1 byte (0 or non-zero, like 42), 4 bytes, packed or padded in structs, etc.</p>

<blockquote>
  <p>bool - integer type, capable of holding one of the two values: true or false. The value of sizeof(bool) is implementation defined and might differ from 1.<br />
<a href="https://en.cppreference.com/w/cpp/language/types.html#Boolean-type">cppreference</a></p>
</blockquote>

<p>👉 Takeaway: <strong>never use bool in data structures that cross boundaries</strong> like files, networks, or IPC.<br />
Stuch a type can be quite pitfall - <em>especially for junior developers</em> -, and safer explicit fixed-width integer types should be preferred.<br />
Beyond the technical aspect, this once again demonstrates how important it is for us developers to <strong>be well-aware of the standard</strong>, rather than constructing a mental representation that may differ from reality; and for trainers/teachers to not over-simplify things.</p>

<blockquote>
  <p>💡 This brings to my mind A.Einstein’s quote <em>”[…] the supreme goal of all theory is to make the irreducible basic elements as simple and as few as possible <strong>without</strong> having to surrender the adequate representation of a single datum of experience.”</em>,<br />
often paraphrased as <em>“Everything should be made as simple as possible, but not simpler”</em>.</p>
</blockquote>

<p>From my perspective, that’s what C++ is fundamentally about: <strong>continuously expanding what’s possible to achieve with code</strong>.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/15-james-mcnellis-our-most-teacherous-adversary.jpg" alt="James McNellis: Our most teacherous adversary - 3 states of booleans" /></p>

<hr />

<p>✋Allow me a quick digression: people often complain that C++ has a steep learning curve (and I partly agree), using things like PRNGs as an example. Sure, Python’s random module gives you a simple API - <code class="language-plaintext highlighter-rouge">dice-roll = random.randint(1, 12)</code> - and it works. But what’s the seed ? What distribution is being used ? If you’re simulating the sum of two dices, you’d probably prefer a Gaussian-like distribution rather than a uniform one.<br />
Which is perfectly feasible in Python, but not without undermining the fallacious argument of simplicity.</p>

<p>Giving it a quite/naive quick shot <em>(disclaimer: I’m not a Python developer, not into maths)</em>:</p>

<ul>
  <li><a href="https://www.online-python.com/25b7heSwV0">Python</a></li>
  <li><a href="https://godbolt.org/z/exhPseKP4">C++</a></li>
</ul>

<h4 id="-rahel-natalie-engel---let-them-eat-cake">⚡ <strong>Rahel Natalie Engel</strong> - let them eat cake</h4>

<p><a href="https://www.youtube.com/watch?v=gQ6grpbhW8k">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/let-them-eat-cake551224.pdf">📄 slidedeck</a></p>

<p>Rahel discussed diversity challenges in tech and shared lessons from university diversity and outreach programs.<br />
Many beginners start with <a href="https://en.wikipedia.org/wiki/Visual-programming-language">visual programming</a> tools like <a href="https://scratch.mit.edu/">Scratch</a> due to time and accessibility constraints, but this often makes the transition to text-based programming difficult.</p>

<p>As a solution, she presented <a href="https://catpie.compscicomp.de/">catpie</a>, an accessible hybrid visual–text tool meant to ease that transition and make early learning more accessible.</p>

<ul>
  <li><a href="https://www.researchgate.net/publication/395534441-Cats-Code-and-Concepts-Learn-to-Program-with-Catpie">Conference paper, on ResearchGate</a></li>
  <li><a href="https://scm.cms.hu-berlin.de/engelrah/catpie">Project’s sources, on Gitlab</a></li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/16-rahel-natalie-engel-let-them-eat-cake-catpie.jpg" alt="screenshot - Rahel Natalie Engel - let them eat cake - catpie" /></p>

<p>💡 A thoughtful reminder that the tools <strong>we choose for beginners often shape their long-term learning path</strong>.<br />
Making programming accessible &amp; fun is crucial, but we must also ensure learners can gradually grow into full programming languages without unnecessary friction.</p>

<h4 id="-robin-savenen-soderholm---vector-to-array-let-the-compiler-turn-heap-into-static-storage">⚡ <strong>Robin Savenen Soderholm</strong> - vector to array: let the compiler turn heap into static storage</h4>

<p><a href="https://www.youtube.com/watch?v=TdL2rvtOGos">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Robin showed how a dynamic, heap-based design used on a Raspberry Pi could be migrated to a much more constrained <a href="https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html">Raspberry Pi Pico</a> by leaning on <code class="language-plaintext highlighter-rouge">constexpr</code> and <code class="language-plaintext highlighter-rouge">consteval</code>.<br />
By letting the compiler evaluate everything at compile time, a <code class="language-plaintext highlighter-rouge">std::vector</code>-like workflow effectively turns into static storage without runtime allocation, which meets the target plateform constraints.</p>

<p>In a nutshell, he presented a simple yet effective <code class="language-plaintext highlighter-rouge">range-to-array</code> function, inspired by <a href="https://meetingcpp.com/mcpp/schedule/talkview.php?th=017b8292e897d1202bf0fe713f0d127e2ae486c9">Mikhail Svetkin’s talk “Harnessing constexpr: A Path to Safer C++”</a>.</p>

<ul>
  <li>takes an <a href="https://en.cppreference.com/w/cpp/concepts/invocable.html">std::invocable</a> as parameter that return type meets the <a href="https://en.cppreference.com/w/cpp/ranges/range.html">std::range</a> requirement.</li>
  <li>the result type is an <a href="https://en.cppreference.com/w/cpp/container/array.html">std::array</a> which <a href="https://en.cppreference.com/w/cpp/ranges/range-size-t.html">std::ranges::range-value-t</a> is the <a href="https://en.cppreference.com/w/cpp/types/result-of.html">std::invoke-result-t</a> of the <code class="language-plaintext highlighter-rouge">invocable</code>, and size is the <a href="https://en.cppreference.com/w/cpp/ranges/size.html">range::size</a> of the <code class="language-plaintext highlighter-rouge">invoke-result-t</code>.</li>
  <li>copy elements generated by the invocable into the array</li>
</ul>

<p>The implementation was something like:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">invocable</span> <span class="k">auto</span> <span class="n">generator</span><span class="p">&gt;</span>
  <span class="k">requires</span> <span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">range</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">invoke</span><span class="o">-</span><span class="n">result</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span><span class="o">&gt;&gt;</span>
<span class="k">consteval</span> <span class="k">auto</span> <span class="n">range</span><span class="o">-</span><span class="n">to</span><span class="o">-</span><span class="n">array</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">using</span> <span class="n">generator</span><span class="o">-</span><span class="n">result</span><span class="o">-</span><span class="n">type</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">invoke</span><span class="o">-</span><span class="n">result</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">generator</span><span class="p">)</span><span class="o">&gt;</span><span class="p">;</span>
  <span class="k">auto</span> <span class="n">result</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">array</span><span class="o">&lt;</span>
      <span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">range</span><span class="o">-</span><span class="n">value</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="n">generator</span><span class="o">-</span><span class="n">result</span><span class="o">-</span><span class="n">type</span><span class="o">&gt;</span><span class="p">,</span>
      <span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">size</span><span class="p">(</span><span class="n">generator</span><span class="o">-</span><span class="n">result</span><span class="o">-</span><span class="n">type</span><span class="p">)</span>
  <span class="o">&gt;</span><span class="p">{};</span>
  <span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">copy</span><span class="p">(</span>
      <span class="n">generator</span><span class="p">(),</span>
      <span class="n">std</span><span class="o">::</span><span class="n">ranges</span><span class="o">::</span><span class="n">begin</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
  <span class="p">);</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/17-robin-savenen-soderholm-vector-to-array-usage.jpg" alt="Robin Savenen Soderholm: vector to array - usage" /></p>

<h4 id="-ganest-rengasamy---meet-qt">⚡ <strong>Ganest Rengasamy</strong> - Meet Qt</h4>

<p><a href="https://www.youtube.com/watch?v=dVwQG2zS4zE">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Rather than explaining what the <a href="https://www.qt.io/development/qt-framework">Qt</a> is, this was a refreshing reintroduction that showed how the framework has evolved to keep up with users and modern industry needs.<br />
The talk highlighted <code class="language-plaintext highlighter-rouge">Qt</code> as a broad, end-to-end platform - well beyond just <a href="https://en.wikipedia.org/wiki/Graphical-user-interface">GUI</a>s - covering cross-plateforms, embedded, desktop, mobile, backend integration, modern UI workflows (Figma), and even 3D assets.</p>

<p>Through an industrial vehicle use case, it showcased <code class="language-plaintext highlighter-rouge">Qt</code> as an end-to-end ecosystem: from backend services ingesting sensor data via <a href="https://en.wikipedia.org/wiki/MQTT">MQTT</a> to Qt-powered UIs designed in <a href="https://www.figma.com/">Figma</a> and even rendering assets from <a href="https://www.blender.org/">Blender</a>.</p>

<p>I haven’t really had the opportunity to use <code class="language-plaintext highlighter-rouge">Qt</code> since my school days (about 15 years ago), where it mostly meant - <em>as far as I remember</em> - GUIs and signal/slots. Back when I was freelancing, I tended to favor C# with <a href="https://en.wikipedia.org/wiki/Extensible-Application-Markup-Language">WPF/XAML</a> for GUI development, as the <a href="https://en.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> experience felt more mature and better integrated to me at the time.</p>

<p>Seeing how much broader and more modern the ecosystem has become makes me genuinely curious to revisit <code class="language-plaintext highlighter-rouge">Qt</code> and explore what other powerful features it offers today to ease my developer needs.</p>

<p>Additional resources:</p>

<ul>
  <li><a href="https://doc.qt.io/qt-6/quick3d-asset-conditioning-export-blender.html">Qt: Exporting from Blender</a></li>
  <li><a href="https://www.qt.io/development/gui-design-figma">Qt: The Fastest Way to Bring Figma Designs to the Product</a></li>
</ul>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/18-ganest-rengasamy-meet-qt.jpg" alt="Ganest Rengasamy: Meet Qt" /></p>

<h4 id="-hannah-lenk---start-teaching-c">⚡ <strong>Hannah Lenk</strong> - Start teaching C++</h4>

<p><a href="https://www.youtube.com/watch?v=f6fEB2N1i00">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2025/start-teaching-cpp932460.pdf">📄 slidedeck</a></p>

<p>Hannah argued that much of the criticism aimed at C++ stems from <strong>outdated usage</strong> and a <strong>lack of teaching</strong> rather than from the language itself. Echoing several talks at the conference (Klaus Iglberger’s, Daniela Engert’s), she challenged the idea that C++ is inherently complex or unsafe, reminding us that <strong>simple does not mean familiar</strong> (see <a href="https://www.youtube.com/watch?v=3eH7JRgLnG8">Pragmatic Simplicity - Actionable Guidelines To Tame Cpp Complexity - Vittorio Romeo - CppCon 2022</a>) and that C++ remains one of the most widely used languages today (top 4 in the <a href="https://www.tiobe.com/tiobe-index/">TIOBE index</a>).</p>

<p>👉 From my perspective, C++ doesn’t have a language problem - it has a <strong>teaching problem</strong>.</p>

<p>If we want better C++ code and fewer misconceptions, we should <strong>start teaching comtemporain C++</strong> to learners (beginners and professional developers),<br />
instead of letting <strong>loud, uninformed voices dominate the narrative</strong>.<br />
Teachers have a huge responsibility here: they should stop teaching C++98 or that so-called “C/C++”, and start teaching modern, simple, elegant and safe contemporain C++. C++ in 2026 feels like another language that C++98.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/19-hannah-lenk-start-teaching-cpp.jpg" alt="Hannah Lenk: Start teaching C++" /></p>

<h4 id="-jens-weller---binary-trees">⚡ <strong>Jens Weller</strong> - binary trees</h4>

<p><a href="https://www.youtube.com/watch?v=0irBIuK2-3k">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Jens shared a thought process that started with a simple question: what does the web - <em>including LLMs chatbots</em>- teach us today about trees in C++ ?</p>

<p>Unsurprisingly, most examples still revolve around pointer-based binary trees, often written in a C-with-classes style using raw pointers, <code class="language-plaintext highlighter-rouge">new</code>/<code class="language-plaintext highlighter-rouge">delete</code>, and little consideration for modern design; which results in inconvenient, error-prone APIs.
With developers increasingly turning to AI assistants instead of search engines, <strong>these patterns are now being amplified rather than challenged</strong> - <code class="language-plaintext highlighter-rouge">ChatGPT</code>, <code class="language-plaintext highlighter-rouge">Grok</code>, <code class="language-plaintext highlighter-rouge">Gemini</code> and similar LLMs tools largely reproduce what they find online, including outdated or incomplete practices.</p>

<p>From there, the talk pivoted toward <a href="https://en.wikipedia.org/wiki/Data-oriented-design">data-oriented design</a>.<br />
Drawing inspiration from past keynotes Jens explored replacing pointers with indices stored in contiguous containers.</p>

<ul>
  <li><a href="https://www.youtube.com/watch?v=rX0ItVEVjHc">CppCon 2014: Mike Acton - “Data-Oriented Design and C++”</a></li>
  <li><a href="https://www.youtube.com/watch?v=SzjJfKHygaQ">CppCon 2025: Vittorio Romeo - More Speed &amp; Simplicity: Practical Data-Oriented Design in C++</a></li>
</ul>

<p>Using indices instead of raw pointers sidesteps incomplete-type issues, enables optional-like semantics, and improves cache locality.<br />
Initial benchmarks <em>(using <a href="https://quick-bench.com/">quick-bench</a>)</em> comparing naive pointer-based trees to index-based implementations showed significant performance differences (about x2). “Not very suprising” - as Jens concluded - yet always worth reminding.</p>

<p>Rather than claiming a definitive/absolute solution, Jens framed this as an exploration. He raised follow-up questions about fairness in benchmarking, allocator effects, and how much of the observed gain comes from cache-friendly layouts versus allocation strategies.<br />
The talk closed by positioning trees as a fertile playground for revisiting long-assumed design choices in the light of modern hardware and language capabilities.</p>

<h5 id="my-takeaway-14">My takeaway</h5>

<p>What started as a casual survey of “binary trees on the internet” quickly turned into <strong>a lesson in intellectual hygiene</strong>.<br />
By showing how most online examples and LLMs-generated answers still promote pointer-heavy, legacy-style implementations, Jens highlighted a deeper issue: many developers, especially juniors, increasingly treat AI tools and forums as a primary source of truth rather than as starting points for critical thinking.</p>

<p>From my perspective, this creates a feedback loop.</p>

<p>👉 LLMs largely reflect the datasets they were trained on, which means they tend to echo and amplify outdated practices. These patterns then get reused for learning, ramp-up, and ultimately copied verbatim into production code and pull requests.<br />
The talk was a timely reminder that contemporain C++ requires discernment: tools can assist us, but responsibility for evaluating design choices - and updating our mental models - still firmly rests with us.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/20-jens-weller-binary-trees.jpg" alt="Jens Weller: binary trees" /></p>

<h3 id="️-james-mcnellis---closing-keynote---a-little-introduction-to-control-flow-integrity">🗣️ <strong>James McNellis</strong> - Closing Keynote - A little introduction to control flow integrity</h3>

<p><a href="https://www.youtube.com/watch?v=-eX7AVB4qzM">🎥 Video</a>, <a href="">📄 slidedeck</a></p>

<p>Speaker: <a href="https://www.linkedin.com/in/jamesmcnellis">James McNellis</a>, game engine security at <a href="https://www.roblox.com/">ROBLOX</a>
About C++ being unsafe (laughs) like about half of the talks here this year.</p>

<p><a href="https://www.linkedin.com/in/jamesmcnellis/">James McNellis</a> (<a href="https://www.roblox.com/">Roblox</a>) closed the conference with a deep yet tour of <a href="https://en.wikipedia.org/wiki/Control-flow-integrity">control-flow integrity (CFI)</a>, grounded in real-world exploitation techniques and modern defenses techs.</p>

<p>He started with a simple &amp; common (and deliberately vulnerable) C example to illustrate how classic buffer overflows can lead to arbitrary code execution, especially when attackers can overwrite return addresses without triggering immediate crashes.</p>

<p>From there, the talk walked through the historical evolution of CFI hacks mitigations: stack canaries, non-executable memory, and address space layout randomization.<br />
While effective, these defenses pushed attackers toward more sophisticated techniques such as <a href="https://en.wikipedia.org/wiki/Return-to-libc-attack">return-to-libc attacks</a> and <a href="https://en.wikipedia.org/wiki/Return-oriented-programming">return-oriented programming (ROP)</a>, where existing instructions - “gadgets” - are chained together to hijack execution without injecting new code.</p>

<p>This led into “CFI v2”: stronger guarantees even in the presence of arbitrary read/write vulnerabilities.<br />
James explained how <a href="https://en.wikipedia.org/wiki/Shadow-stack">shadow stacks</a> (notably Intel CET), <a href="https://learn.arm.com/learning-paths/servers-and-cloud-computing/pac/pac/">ARMs pointer authentication (PAC)</a>, and newer mechanisms like <a href="https://docs.kernel.org/arch/arm64/gcs.html">ARM’s Guarded Control Stack (GCS)</a>, comparing their security properties and tradeoffs.</p>

<p>The second half of the talk addressed (no pune intended) - function pointers and virtual dispatch - covering <a href="https://learn.microsoft.com/en-us/windows/win32/secbp/control-flow-guard">Microsoft’s Control Flow Guard</a>, <a href="https://clang.llvm.org/docs/ControlFlowIntegrity.html">Clang CFI</a>, and hardware-assisted mechanisms like <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/branch-history-injection.html">Intel’s Indirect Branch Tracking (IBT)</a> and <a href="https://newsroom.arm.com/blog/pac-bti">ARM’s Branch Target Identifier (BTI)</a>, all designed to restrict execution to valid control-flow targets.</p>

<p><img src="/publications/assets/img/meeting-cpp-2025/screenshots/21-01-james-mcnellis-closing-keynote-a-little-introduction-to-control-flow-integrity.jpg" alt="James McNellis: Closing Keynote - A little introduction to control flow integrity - Calls and Returns" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/21-02-james-mcnellis-closing-keynote-a-little-introduction-to-control-flow-integrity.jpg" alt="James McNellis: Closing Keynote - A little introduction to control flow integrity - PAC" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/21-03-james-mcnellis-closing-keynote-a-little-introduction-to-control-flow-integrity.jpg" alt="James McNellis: Closing Keynote - A little introduction to control flow integrity - return address protection with PAC" />
<img src="/publications/assets/img/meeting-cpp-2025/screenshots/21-04-james-mcnellis-closing-keynote-a-little-introduction-to-control-flow-integrity.jpg" alt="James McNellis: Closing Keynote - A little introduction to control flow integrity - Control flow guard vs. Clang CFI" /></p>

<h4 id="my-takeaway-15">My takeaway</h4>

<p>This talk offered an excellent big-picture overview, but it also left me feeling pleasantly overwhelmed - packed with so many new concepts, mechanisms, tools and ideas as it clearly opened far more doors than it could fully cover/explore in one session.</p>

<p>It also made it very concrete how far the industry has gone to <strong>harden C++ execution</strong> without changing the language itself, and how much <strong>modern security is about the overall eco-system</strong>, as it relies on a tight collaboration between compilers, kernels, and hardware.<br />
It also reminded me that as always in security, raising the bar for defenders doesn’t end the problem - it shifts it. Each new protection forces attackers to adapt and invent new techniques.</p>

<p>It reinforced the idea that <strong>crashes are often preferable to silent exploitation</strong>, and that <strong>layered defenses</strong> - even imperfect ones - dramatically raise the bar for attackers.<br />
As a C++ developer, it also reminded me that understanding these mechanisms isn’t optional anymore: knowing how the code we write code interacts with CFI, <a href="https://ebadblog.com/indirect-function-calls-and-control-flow-integrity">indirect calls</a>, and modern CPUs is part of writing responsible, resilient, and production-grade C++.</p>

<hr />

<h3 id="-allow-me-a-disgression-here">🤚 Allow me a disgression here</h3>

<p>I would like to take this opportunity to share a personal opinion.</p>

<p>I was recently reminded how damaging loud but poorly informed voices can be. A popular French tech YouTube channel, <a href="https://www.youtube.com/@Underscore_">Underscore_</a>, released <a href="https://www.youtube.com/watch?v=hbHgIzIbzmQ">a video</a> titled <em>“major companies are abandoning C/C++ for <a href="https://rust-lang.org/">Rust</a>“</em>.<br />
Unfortunately, the arguments incriminating C++ relied almost entirely on C++98-style concepts, technics and examples: conflating C and C++, and ignoring <strong>decades of language evolution</strong>.<br />
By portraying manual <a href="https://en.cppreference.com/w/cpp/memory/new.html">new/delete</a>, fragile lifetimes, and unsafe concurrency as the norm, it presents a picture of C++ that simply no longer reflects contemporain practice.</p>

<p>👉 The problem is not disagreement or criticism <em>per se</em>, but the <strong>impact of large-scale vulgarization when it is built on shaky premises</strong>.<br />
Influencers, federal agencies, and politicians content reaches far beyond engineers; it reaches managers, executives, and policy-influenced decision-makers. When those audiences internalize flawed narratives about C++, the resulting decisions can steer entire organizations - and sometimes the industry - based on fear and misconceptions rather than on facts.</p>

<blockquote>
  <p>💡 <strong>In a nutshell</strong>: should we stop coding in C++ in 2026 ?</p>

  <ul>
    <li>Yes, if you want to <strong>dogmatically</strong> obey OCND, CISA and FBI, and follow trends in general with poor or no critical thinking.</li>
    <li>If you’re <strong>pragmatic</strong> on the other end, then <strong>no</strong>: keep learning, teaching, coding, and creating safe, reliable products ! ❤️</li>
  </ul>
</blockquote>

<p>Take for instance those two posts <a href="https://dev.to/dev-tips/2025-will-be-the-year-of-rust-why-big-tech-is-ditching-c-178p">2025 Will Be the Year of Rust - Why Big Tech Is Ditching C++</a> and <a href="https://www.itjungle.com/2024/12/02/stop-coding-in-c-and-c-feds-say/">Stop Coding In C and C++, Feds Say</a>. It uses the same - often, fallacious - arguments, claiming:</p>

<table>
  <thead>
    <tr>
      <th>Argument</th>
      <th>My perspective</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rust is not a drop-in replacement for C++</td>
      <td>Agree</td>
    </tr>
    <tr>
      <td>C++ Build system (CMake) is a pain</td>
      <td>Partially Agree. CMake is a de-facto build system for many languages.</td>
    </tr>
    <tr>
      <td>C++ does not fit high-risk</td>
      <td>Legacy C++ don’t. Contemporain does.</td>
    </tr>
    <tr>
      <td>Poor memory safety</td>
      <td>Ever heard of <code class="language-plaintext highlighter-rouge">{ type value; }</code> ? <code class="language-plaintext highlighter-rouge">std::unique-ptr</code> ?  etc.</td>
    </tr>
    <tr>
      <td>Tech-debt, maintaining cost endanger teams productivity</td>
      <td>Not a language-specific thing</td>
    </tr>
    <tr>
      <td>Lack of consistent formatting</td>
      <td><code class="language-plaintext highlighter-rouge">clang-format</code> and other tools are meant for that</td>
    </tr>
    <tr>
      <td>Need to modernize with modern language features</td>
      <td>Not a language-specific thing. No need, but one should.</td>
    </tr>
    <tr>
      <td>Lack of safe concurrency primitives</td>
      <td>STL’s <a href="https://en.cppreference.com/w/cpp/thread.html">concurrency support library</a>, <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html">P2300 sender-receiver</a>, etc.</td>
    </tr>
  </tbody>
</table>

<p>Also:</p>

<ul>
  <li>C++ syntax is difficult, the error messages are vague, and even writing basic, safe programs can call for thorough understanding of memory management.</li>
  <li>Modern developers find C++ antiquated, difficult, and hostile to newbies</li>
  <li>Rust’s syntax is expressive</li>
</ul>

<h4 id="lets-code">Let’s code</h4>

<p><strong>Disclaimer</strong>: I am not familiar with <code class="language-plaintext highlighter-rouge">Rust</code> yet, and my impressions are based on very limited exposure. As such, <strong>my observations may be incomplete or biased</strong>, just as some of the criticisms often directed at C++ are when they rely on outdated assumptions, as mentioned above. Please give me credit for mentioning and being honest about these limitations.<br />
Also, comparing programming languages honestly is inherently difficult: each comes with its own strengths and trade-offs, which calls for nuance rather than absolute judgments.</p>

<p>That said, I Googled <em>“production-ready Rust snippet”</em>, found <a href="https://reintech.io/blog/understanding-implementing-rust-metaprogramming">this one</a> in the first results, and played with it on <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2024&amp;gist=a1ec32d808bc38e5f9073fb59da39608">play.rust-lang.org here</a> then <a href="https://godbolt.org/z/zdscfb3Kb">godbolt</a>.</p>

<details>

  <summary>👀 Show me the code !</summary>

  <div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">macro</span><span class="o">-</span><span class="nd">rules!</span> <span class="n">hashmap</span> <span class="p">{</span>

      <span class="c1">// Handle key-value pairs</span>
      <span class="p">(</span>$<span class="p">(</span>$<span class="n">key</span><span class="p">:</span><span class="n">expr</span> <span class="k">=&gt;</span> $<span class="n">value</span><span class="p">:</span><span class="n">expr</span><span class="p">),</span><span class="o">+</span> $<span class="p">(,)</span><span class="o">?</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">;</span>
  <span class="p">}</span>

  <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
      <span class="k">let</span> <span class="n">config</span> <span class="o">=</span> <span class="nd">hashmap!</span> <span class="p">{</span>
          <span class="s">"timeout"</span> <span class="k">=&gt;</span> <span class="mi">30</span><span class="p">,</span>
          <span class="s">"retries"</span> <span class="k">=&gt;</span> <span class="mi">3</span><span class="p">,</span>
          <span class="s">"debug"</span> <span class="k">=&gt;</span> <span class="mi">1</span>
      <span class="p">};</span>
      
      <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">config</span><span class="p">);</span>
  <span class="p">}</span>
</code></pre></div>  </div>

  <p>Which one could somehow translate in C++ like (see here on <a href="https://godbolt.org/z/Prj3zfs8d">godbolt</a>):</p>

  <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span><span class="k">auto</span> <span class="o">&amp;&amp;</span> <span class="p">...</span> <span class="n">pairs</span><span class="p">)</span>
  <span class="p">{</span>
      <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">unordered</span><span class="o">-</span><span class="n">map</span> <span class="p">{</span> <span class="n">pairs</span><span class="p">...</span> <span class="p">};</span>
  <span class="p">}</span>

  <span class="k">auto</span> <span class="n">main</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>

      <span class="k">auto</span> <span class="n">config</span> <span class="o">=</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span><span class="s">"timeout"</span><span class="p">,</span> <span class="mi">30</span><span class="p">},</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span><span class="s">"retries"</span><span class="p">,</span> <span class="mi">3</span><span class="p">},</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span><span class="s">"debug"</span><span class="p">,</span> <span class="mi">1</span><span class="p">}</span>
      <span class="p">);</span>

      <span class="n">std</span><span class="o">::</span><span class="n">println</span><span class="p">(</span><span class="s">"{}"</span><span class="p">,</span> <span class="n">config</span><span class="p">);</span>
  <span class="p">}</span>
</code></pre></div>  </div>

  <p>Of course one might prefer using function rather than a macro:</p>

  <div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">fn</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">I</span><span class="o">&gt;</span><span class="p">(</span><span class="n">pairs</span><span class="p">:</span> <span class="n">I</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span>
  <span class="k">where</span>
      <span class="n">K</span><span class="p">:</span> <span class="nn">std</span><span class="p">::</span><span class="nn">hash</span><span class="p">::</span><span class="n">Hash</span> <span class="o">+</span> <span class="nb">Eq</span><span class="p">,</span>
      <span class="n">I</span><span class="p">:</span> <span class="nb">IntoIterator</span><span class="o">&lt;</span><span class="n">Item</span> <span class="o">=</span> <span class="p">(</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="p">)</span><span class="o">&gt;</span><span class="p">,</span>
  <span class="p">{</span>
      <span class="n">pairs</span><span class="py">.into</span><span class="o">-</span><span class="nf">iter</span><span class="p">()</span><span class="nf">.collect</span><span class="p">()</span>
  <span class="p">}</span>

  <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
      <span class="k">let</span> <span class="n">config</span> <span class="o">=</span> <span class="n">make</span><span class="o">-</span><span class="nf">hashmap</span><span class="p">([</span>
          <span class="p">(</span><span class="s">"timeout"</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
          <span class="p">(</span><span class="s">"retries"</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
          <span class="p">(</span><span class="s">"debug"</span><span class="p">,</span>   <span class="mi">1</span><span class="p">)</span>
      <span class="p">]);</span>
      
      <span class="nd">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span> <span class="n">config</span><span class="p">);</span>
  <span class="p">}</span>
</code></pre></div>  </div>

  <p>which equivalent could be</p>

  <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span><span class="o">...</span> <span class="nc">keys</span><span class="p">,</span> <span class="k">class</span> <span class="o">...</span> <span class="nc">values</span><span class="p">&gt;</span>
  <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">keys</span><span class="p">,</span> <span class="n">values</span><span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="p">...</span> <span class="n">pairs</span><span class="p">)</span>
  <span class="p">{</span>
      <span class="k">using</span> <span class="n">K</span> <span class="o">=</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">common</span><span class="o">-</span><span class="n">type</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="n">keys</span><span class="p">...</span><span class="o">&gt;</span><span class="p">;</span>
      <span class="k">using</span> <span class="n">V</span> <span class="o">=</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">common</span><span class="o">-</span><span class="n">type</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="n">values</span><span class="p">...</span><span class="o">&gt;</span><span class="p">;</span>

      <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">unordered</span><span class="o">-</span><span class="n">map</span><span class="o">&lt;</span><span class="n">K</span><span class="p">,</span> <span class="n">V</span><span class="o">&gt;</span><span class="p">{</span>
          <span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">pairs</span><span class="p">)</span><span class="o">&gt;</span><span class="p">(</span><span class="n">pairs</span><span class="p">)...</span>
      <span class="p">};</span>
  <span class="p">}</span>

  <span class="k">auto</span> <span class="n">main</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">int</span> <span class="p">{</span>

      <span class="k">const</span> <span class="k">auto</span> <span class="n">config</span> <span class="o">=</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span> <span class="s">"timeout"</span><span class="p">,</span> <span class="mi">30</span> <span class="p">},</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span> <span class="s">"retries"</span><span class="p">,</span> <span class="mi">3</span>  <span class="p">},</span>
          <span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="p">{</span> <span class="s">"debug"</span><span class="p">,</span>   <span class="mi">1</span>  <span class="p">},</span>
      <span class="p">);</span>

      <span class="n">std</span><span class="o">::</span><span class="n">println</span><span class="p">(</span><span class="s">"{}</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">config</span><span class="p">);</span>
  <span class="p">}</span>
</code></pre></div>  </div>

  <p>to which one might want to add the following overloads to avoid error-bloat</p>

  <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(){</span>
      <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">invalid</span><span class="o">-</span><span class="n">argument</span><span class="p">{</span> <span class="s">"cannot deduce map type"</span> <span class="p">};</span>
  <span class="p">}</span>

  <span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span><span class="o">...</span> <span class="nc">keys</span><span class="p">,</span> <span class="k">class</span> <span class="o">...</span> <span class="nc">values</span><span class="p">&gt;</span>
  <span class="k">requires</span> <span class="p">(</span><span class="n">not</span> <span class="k">requires</span> <span class="p">{</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">common</span><span class="o">-</span><span class="n">type</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="n">keys</span><span class="p">...</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">})</span>
  <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">keys</span><span class="p">,</span> <span class="n">values</span><span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="p">...){</span>
      <span class="k">static</span><span class="o">-</span><span class="n">assert</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="s">"mismatched types (key)"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span><span class="o">...</span> <span class="nc">keys</span><span class="p">,</span> <span class="k">class</span> <span class="o">...</span> <span class="nc">values</span><span class="p">&gt;</span>
  <span class="k">requires</span> <span class="p">(</span><span class="n">not</span> <span class="k">requires</span> <span class="p">{</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">common</span><span class="o">-</span><span class="n">type</span><span class="o">-</span><span class="n">t</span><span class="o">&lt;</span><span class="n">values</span><span class="p">...</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">})</span>
  <span class="k">constexpr</span> <span class="k">auto</span> <span class="n">make</span><span class="o">-</span><span class="n">hashmap</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">keys</span><span class="p">,</span> <span class="n">values</span><span class="o">&gt;</span> <span class="o">&amp;&amp;</span> <span class="p">...){</span>
      <span class="k">static</span><span class="o">-</span><span class="n">assert</span><span class="p">(</span><span class="nb">false</span><span class="p">,</span> <span class="s">"mismatched types (value)"</span><span class="p">);</span>
  <span class="p">}</span>
</code></pre></div>  </div>

  <p>Or the <code class="language-plaintext highlighter-rouge">if-constexpr</code> equivalents.</p>

  <p>Find the full <a href="https://godbolt.org/z/v1aMa7Ez5">C++ example here on godbolt</a> and <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2024&amp;gist=565096ff51dd0489d19a7e50667ae871">Rust example here on play.rust-lang.org</a> or <a href="https://godbolt.org/z/jf1bKb7Kh">here on godbolt</a>.</p>

</details>

<blockquote>
  <p>Comparing the amount of assembly lines suprised me: <a href="https://godbolt.org/z/E1rzGqcWv">C++</a> produced <strong>73 lines</strong>, while <a href="https://godbolt.org/z/dP6Y1fhxf">Rust</a> produced about <strong>1000 lines</strong>. Most likely something I do not understand at that point 🤔. I’ll make sure to dig that sometime soon.</p>
</blockquote>

<h4 id="so-what-is-the-takeaway-for-me-on-this-">So what is the takeaway for me on this ?</h4>

<p>Rust’s syntax does not inherently strike me as simpler or clearer than contemporain C++’s. For example, Rust’s macro system-expressions such as <code class="language-plaintext highlighter-rouge">($($key:expr =&gt; $value:expr),+ $(,)?) =&gt; </code> can feel quite dense on first encounter, almost reminiscent of <a href="https://en.wikipedia.org/wiki/Regular-expression">regular expressions</a> in terms of readability, approachability and maintainability.</p>

<p>In the C++ examples I considered, there were no hard-to-manage lifetimes, no raw or user-facing pointers, no new/delete, and no explicit ownership wrappers such as <a href="https://en.cppreference.com/w/cpp/memory/unique-ptr.html">std::unique-ptr</a>.<br />
Instead, the code relied on value semantics, <a href="https://en.cppreference.com/w/cpp/language/copy-elision.html">(N)RVO and copy elision</a>, and features like <a href="https://en.cppreference.com/w/cpp/language/class-template-argument-deduction.html">Class Template Argument Deduction (CTAD)</a> to significantly reduce boilerplate.</p>

<p>That said, <code class="language-plaintext highlighter-rouge">Rust</code> does excel at producing compiler error diagnostics that are generally more beginner-friendly, whereas C++ diagnostics tend to be more verbose and detailed, which can be both a strength and a challenge <strong>depending on experience level</strong>.<br />
My view is that compilers provide full, verbose diagnostics primarily to avoid bias and misinterpretation. That makes sense.<br />
Still, in well-understood situations, they could offer a more human-friendly first message - clearly marked as a hint - followed by the complete diagnostic. Ideally, this would be configurable by the user (opt-out ?).<br />
This point reminded me of <a href="https://tartanllama.xyz/">Sy Brand</a>’s talk <a href="https://www.youtube.com/watch?v=Bi-J1amqFTA">C++ Compiler Errors for Humans | Pure Virtual C++ 2023</a>.</p>

<p>👉 In Rust - as in C++ - developers are offered multiple ways to achieve the same behavior (especially from a business-logic perspective).</p>

<p>Ultimately, the real distinction lies not (only) in some absolute notion of capability or safety, but more in how each language is taught, positioned, and applied.<br />
Choosing a programming language should remain a <strong>pragmatic decision driven by project constraints</strong>, domain requirements, and long-term maintainability - <strong>not by trends nor ideological preferences</strong>.</p>

<p><code class="language-plaintext highlighter-rouge">Rust</code> is often perceived as easier to learn in part because it is a <strong>younger language</strong>, taught with a clean slate and modern practices from day one.<br />
<strong>C++, however, has evolved</strong> just as significantly over the past decades; when taught starting from contemporary C++ - with value semantics, strong types, RAII, and modern tooling - <strong>it feels like an entirely different language</strong> than the one many still associate with outdated techniques.</p>

<blockquote>
  <p>💡 C++ super-power is to always adapt &amp; evolve, to meets the industry needs.</p>
</blockquote>

<p>As such, a key responsibility lies with educators and experienced developers: to teach modern/contemporain C++, not legacy idioms. When approached this way, learning C++ can be just as accessible and rewarding for beginners, while still offering the <strong>unmatched level of expressiveness, control and performance</strong> that defines its role in the industry.</p>

<hr />

<h2 id="conclusion-1">Conclusion</h2>

<p>This conference reinforced something I deeply believe since 2011: <strong>C++ is very much alive, evolving</strong>, and steadily addressing the real concerns of our industry: <strong>safety, performance, and maintainability</strong>, but also education.<br />
Many of the talks converged on the same idea: the language itself is not the problem. Mindsets, outdated practices, misinformation, and fear-driven narratives too often are.</p>

<p>We currently live in an era dominated by trends, buzzwords, and speculative claims, where <strong>loud voices and simplified narratives can overshadow nuance and facts</strong>.<br />
In that context, the C++ community feels to me like a light in the darkness. It is a community that values <strong>rigor over hype</strong>, <strong>pragmatism over dogmas</strong>, and <strong>long-term thinking over short-term trends</strong>.</p>

<p>As opposed to what many uninformed narratives suggest, C++ has not stagnated or blindly chased novelty. It has evolved by adding meaningful features that extend what developers can express thus achieve, while continuously improving safety, clarity/expressiveness, and accessibility - and, importantly, by simplifying many aspects of everyday development rather than making them more complex.</p>

<p>No, modern C++ does not require developers to scatter raw pointers (<code class="language-plaintext highlighter-rouge">*</code>) everywhere, turning code into what C++98 once (and still too often) resembled: a syntactic xmas tree (⭐ -&gt; 🎄).<br />
No, expressing intent no longer means writing tons of LoCs with deeply nested for-while-for–if–else-break-goto control-flow labyrinths, which “stonks” cognitive complexity.<br />
No, developers are not forced nor encouraged into “OOP” inheritance-heavy, vtable-driven designs at the user level.<br />
These techniques still exist when they are the right tool - but they are no longer the default, nor the necessity. More importantly, delivering value in C++ no longer requires excessive amounts of code.</p>

<p>👉 Contemporain C++ enables developers to translate ideas directly into expressive, maintainable, and safe abstractions: code that is concise, robust, and adequate for production.<br />
What also stood out is the community’s willingness to always <strong>self-criticize, improve, and teach</strong>. That culture of responsibility - combined with a passion for sharing knowledge - is what keeps C++ relevant and trustworthy.</p>

<p>However, is it worth <strong>opposing reason to ignorance, hype, and comforting falsehoods</strong> ? That is a question I keep coming back to.</p>

<p>Engaging in this fight is not free. It demands emotional energy, time, and resilience. Confronting misinformation and intellectual laziness can be deeply demoralizing, especially when loud voices drown out careful reasoning.<br />
And yet, choosing not to act comes at an even higher cost. Remaining silent would mean accepting ideas I know to be wrong - and that is something I could not reconcile with myself.<br />
We may not all change the world, but we are all responsible for the small part we influence: colleagues, friends, local meetups members, but also and especially junior developers and managers.</p>

<p>Why keep pushing back ? Not to win arguments, but to do our part. To be a small spark in the darkness, even when the night feels long.</p>

<p>When engaging in these debates, there is always the risk of being perceived as someone who’s resistant/reluctant to change (remember last year’s talk from <a href="https://www.youtube.com/watch?v=g6QYGW-TwwY">Peter Sommerlad, “Collective Amnesia?”</a>: <em>“Pay attention - don’t become the grumpy old man ranting”</em>).<br />
It is equally difficult to challenge misleading narratives without unintentionally amplifying the very buzz, hype, or trolling one is trying to counter.<br />
Arguing rarely - if not, never - has an immediate impact, even with the most valuable, sourced arguments. No one ever said <em>“You convinced me, I changed my mind”</em>: admitting you’re wrong takes efforts, humility, and critical thinking.<br />
Even when arguments do not persuade immediately, they still plant seeds: ideas that may take time to grow, but can flourish if given space and care.</p>

<p>👉 If fear, trends, and buzzwords shift the <a href="https://en.wikipedia.org/wiki/Overton-window">Overton window</a> in one direction, then it becomes our collective responsibility to push it back toward <strong>reason and facts</strong>.</p>

<p>As conclusion, taken individually, our efforts may seem insignificant. Together, they matter.<br />
By standing united, grounded in facts, education, and pragmatism, we can steadily push back against disinformation and belief-driven narratives. We oppose nuance and subtlety to oversimplification and dogmatism.
Progress may be slow, but reason has a quiet strength - and over time, it endures.</p>

<p>Leaving this conference, I feel both reassured and energized.</p>

<p><strong>Reassured</strong> that C++ continues to evolve in the right direction, and <strong>energized</strong> to keep learning, teaching, and pushing back against simplistic narratives.<br />
If there is one takeaway to carry forward, it is this: as we stand together, then education and pragmatism will eventually outlast hype and misinformation - and the C++ community embodies that better than ever.</p>

<p>Thanks for reading, and see you next year at Meeting C++! ❤️</p>

<p>Guillaume.</p>

<hr />

<p>If you enjoyed this paper:</p>

<ul>
  <li>👍 Consider leaving a <em>“like”</em> and a <strong>comment</strong> - at the bottom of this page, and on <strong>LinkedIn</strong>.</li>
  <li>📩 Share this paper with your friends, colleagues, teachers, students.</li>
  <li>📖 You might be interested in last year’s: <a href="/publications/2025/03/01/meeting-cpp-2024-trip-report/">Conference - Meeting Cpp 2024 - Trip report</a>.</li>
</ul>

<h2 id="related-posts">Related posts</h2>

<ul>
  <li><a href="/publications/2025/03/01/meeting-cpp-2024-trip-report/">Conference - Meeting Cpp 2024 - Trip report</a>.</li>
  <li><a href="https://gist.github.com/GuillaumeDua/f1884df852fc99e4df258c8d404e844f">Conference - C++ in Paris Conference 2021 - Trip report</a></li>
  <li><a href="https://gist.github.com/GuillaumeDua/b354dd4c46df160dbfd04c31b2a51c80">Conference - Meeting Cpp 2021 - Trip report</a></li>
</ul>]]></content><author><name>Guillaume Dua</name><email>pro.guillaume.dua+blog@gmail.com</email></author><category term="cpp" /><category term="trip-report" /><category term="meeting-cpp" /><category term="conference" /><summary type="html"><![CDATA[My trip report for the Meeting Cpp 2025 conference]]></summary></entry><entry><title type="html">Meeting Cpp 2025 Trip Report</title><link href="https://guillaumedua.github.io/publications/2025/03/13/meeting-cpp-2025-trip-report/" rel="alternate" type="text/html" title="Meeting Cpp 2025 Trip Report" /><published>2025-03-13T00:00:00+00:00</published><updated>2025-03-13T00:00:00+00:00</updated><id>https://guillaumedua.github.io/publications/2025/03/13/meeting-cpp-2025-trip-report</id><content type="html" xml:base="https://guillaumedua.github.io/publications/2025/03/13/meeting-cpp-2025-trip-report/"><![CDATA[<p>&lt;!DOCTYPE html&gt;</p>
<html>
<head>
  <meta http-equiv="refresh" content="0; url=https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report/" />
  <link rel="canonical" href="https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report/" />
</head>
<body>
  <p>Redirecting... <a href="https://guillaumedua.github.io/publications/2026/03/13/meeting-cpp-2025-trip-report/">Click here if not redirected</a></p>
</body>
</html>]]></content><author><name>Guillaume Dua</name><email>pro.guillaume.dua+blog@gmail.com</email></author><summary type="html"><![CDATA[&lt;!DOCTYPE html&gt; Redirecting... Click here if not redirected]]></summary></entry><entry><title type="html">Trip Report - Meeting Cpp 2024</title><link href="https://guillaumedua.github.io/publications/2025/03/01/meeting-cpp-2024-trip-report/" rel="alternate" type="text/html" title="Trip Report - Meeting Cpp 2024" /><published>2025-03-01T00:00:00+00:00</published><updated>2025-03-01T00:00:00+00:00</updated><id>https://guillaumedua.github.io/publications/2025/03/01/meeting-cpp-2024-trip-report</id><content type="html" xml:base="https://guillaumedua.github.io/publications/2025/03/01/meeting-cpp-2024-trip-report/"><![CDATA[<p>ℹ️ This post was originally published as a <a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669">GitHub Gist</a>.<br />
Original <strong>comments</strong> and <strong>reactions</strong> remain available there.</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Event</td>
      <td><a href="https://meetingcpp.com/2024/">Meeting C++ conference, 2024</a></td>
    </tr>
    <tr>
      <td>Author</td>
      <td>Guillaume Dua</td>
    </tr>
    <tr>
      <td>Date</td>
      <td>11/14/2024 - 01/13/2025</td>
    </tr>
    <tr>
      <td>My attendance sponsor</td>
      <td><a href="https://www.fairmat.tech/">Fairmat</a></td>
    </tr>
    <tr>
      <td>Revision</td>
      <td>R2</td>
    </tr>
  </tbody>
</table>

<hr />

<ul id="markdown-toc">
  <li><a href="#introduction" id="markdown-toc-introduction">Introduction</a>    <ul>
      <li><a href="#personnal-thoughts-about-the-conference" id="markdown-toc-personnal-thoughts-about-the-conference">Personnal thoughts about the conference</a></li>
      <li><a href="#disclaimer" id="markdown-toc-disclaimer">Disclaimer</a></li>
    </ul>
  </li>
  <li><a href="#-11142024" id="markdown-toc--11142024">📅 11/14/2024</a>    <ul>
      <li><a href="#️-jens-weller-welcome-message" id="markdown-toc-️-jens-weller-welcome-message">🗣️ <strong>Jens Weller</strong>: Welcome Message</a></li>
      <li><a href="#️-titus-winters-opening-keynote---fear-in-tech" id="markdown-toc-️-titus-winters-opening-keynote---fear-in-tech">🗣️ <strong>Titus Winters</strong>: Opening Keynote - Fear in tech</a>        <ul>
          <li><a href="#psychological-safety-over-fear--anxiety" id="markdown-toc-psychological-safety-over-fear--anxiety"><strong>Psychological safety</strong> over <strong>fear</strong> &amp; <strong>anxiety</strong></a></li>
          <li><a href="#culture-is-key" id="markdown-toc-culture-is-key"><strong>Culture</strong> is key</a></li>
          <li><a href="#learning-and-growth-as-a-team" id="markdown-toc-learning-and-growth-as-a-team"><strong>Learning</strong> and growth as a team</a></li>
          <li><a href="#sustainability-in-software" id="markdown-toc-sustainability-in-software"><strong>Sustainability</strong> in software</a></li>
          <li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
        </ul>
      </li>
      <li><a href="#️-andreas-weis-c-modules---getting-started-today" id="markdown-toc-️-andreas-weis-c-modules---getting-started-today">🗣️ <strong>Andreas Weis</strong>: C++ Modules - Getting Started Today</a>        <ul>
          <li><a href="#includes-limitations" id="markdown-toc-includes-limitations">Includes limitations</a></li>
          <li><a href="#how-modules-address-such-issues" id="markdown-toc-how-modules-address-such-issues">How modules address such issues</a></li>
          <li><a href="#challenges-in-adopting-modules" id="markdown-toc-challenges-in-adopting-modules">Challenges in adopting modules</a></li>
          <li><a href="#practical-advice-for-getting-started" id="markdown-toc-practical-advice-for-getting-started">Practical advice for getting started</a></li>
          <li><a href="#conclusion-1" id="markdown-toc-conclusion-1">Conclusion</a></li>
        </ul>
      </li>
      <li><a href="#️-philipp-dominik-schubert-the-notorious-bug---the-most-popular-bugs-and-code-smells-in-c-and-c" id="markdown-toc-️-philipp-dominik-schubert-the-notorious-bug---the-most-popular-bugs-and-code-smells-in-c-and-c">🗣️ <strong>Philipp Dominik Schubert</strong>: The Notorious B.U.G. - The Most Popular Bugs and Code Smells in C and C++</a>        <ul>
          <li><a href="#bug-hunting-at-sonar" id="markdown-toc-bug-hunting-at-sonar">Bug hunting at <strong>Sonar</strong></a></li>
          <li><a href="#challenges-while-detecting-bugs" id="markdown-toc-challenges-while-detecting-bugs">Challenges while detecting bugs</a></li>
          <li><a href="#top-10-bugs-and-code-smells-in-c" id="markdown-toc-top-10-bugs-and-code-smells-in-c">Top 10 bugs and code smells in C++</a></li>
          <li><a href="#questioning-root-causes" id="markdown-toc-questioning-root-causes">Questioning root causes</a></li>
          <li><a href="#how-to-improve-code-quality-" id="markdown-toc-how-to-improve-code-quality-">How to improve code quality ?</a></li>
        </ul>
      </li>
      <li><a href="#️-goran-aranđelović-introduction-to-senderreceiver-framework" id="markdown-toc-️-goran-aranđelović-introduction-to-senderreceiver-framework">🗣️ <strong>Goran Aranđelović</strong>: Introduction to Sender/Receiver framework</a>        <ul>
          <li><a href="#why-do-we-need-such-a-new-framework-" id="markdown-toc-why-do-we-need-such-a-new-framework-">Why do we need such a new framework ?</a></li>
          <li><a href="#introducing-senders--receivers-as-described-in-p2300" id="markdown-toc-introducing-senders--receivers-as-described-in-p2300">Introducing senders &amp; receivers, as described in P2300</a></li>
          <li><a href="#advantages-of-senders--receivers-when-compared-with-existing-models" id="markdown-toc-advantages-of-senders--receivers-when-compared-with-existing-models">Advantages of senders &amp; receivers when compared with existing models</a></li>
          <li><a href="#senders--receivers-are-not-a-replacement-for-coroutines" id="markdown-toc-senders--receivers-are-not-a-replacement-for-coroutines">Senders &amp; Receivers are not a replacement for coroutines</a></li>
          <li><a href="#key-takeaways" id="markdown-toc-key-takeaways">Key takeaways</a></li>
        </ul>
      </li>
      <li><a href="#️-klaus-iglberger-there-is-no-silver-bullet" id="markdown-toc-️-klaus-iglberger-there-is-no-silver-bullet">🗣️ <strong>Klaus Iglberger</strong>: There is no Silver Bullet</a>        <ul>
          <li><a href="#traditional-oopvtable-approach" id="markdown-toc-traditional-oopvtable-approach">Traditional <strong>OOP</strong>/<code class="language-plaintext highlighter-rouge">vtable</code> approach</a></li>
          <li><a href="#is-stdvariant-a-modern-alternative-" id="markdown-toc-is-stdvariant-a-modern-alternative-">Is <code class="language-plaintext highlighter-rouge">std::variant</code> (a modern) alternative ?</a></li>
          <li><a href="#templates-to-the-rescue-" id="markdown-toc-templates-to-the-rescue-">Templates to the rescue ?</a></li>
          <li><a href="#what-about-type-erasure-" id="markdown-toc-what-about-type-erasure-">What about type-erasure ?</a></li>
          <li><a href="#conclusion-2" id="markdown-toc-conclusion-2">Conclusion</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#-11152024" id="markdown-toc--11152024">📅 11/15/2024</a>    <ul>
      <li><a href="#️-jens-weller-good-morning-meeting-c" id="markdown-toc-️-jens-weller-good-morning-meeting-c">🗣️ Jens Weller: Good Morning Meeting C++</a>        <ul>
          <li><a href="#a-journey-to-produce-meeting-c-tshirts" id="markdown-toc-a-journey-to-produce-meeting-c-tshirts">A journey to produce Meeting C++ tshirts</a></li>
        </ul>
      </li>
      <li><a href="#️-hana-dusíková-center-keynote---my-favorite-data-structures" id="markdown-toc-️-hana-dusíková-center-keynote---my-favorite-data-structures">🗣️ Hana Dusíková: Center Keynote - my favorite data structures</a>        <ul>
          <li><a href="#about-the-speaker" id="markdown-toc-about-the-speaker">About the speaker</a></li>
          <li><a href="#exploring-symbolic-execution-in-c" id="markdown-toc-exploring-symbolic-execution-in-c">Exploring symbolic execution in C++</a></li>
          <li><a href="#constexpr-containers-in-the-standard-library" id="markdown-toc-constexpr-containers-in-the-standard-library"><code class="language-plaintext highlighter-rouge">constexpr</code> containers in the standard library</a></li>
          <li><a href="#about-constexpr-limitations" id="markdown-toc-about-constexpr-limitations">About <code class="language-plaintext highlighter-rouge">constexpr</code> limitations</a></li>
          <li><a href="#her-favorite-data-structure-hash-array-mapped-trie-hamt" id="markdown-toc-her-favorite-data-structure-hash-array-mapped-trie-hamt">Her favorite data-structure: Hash array mapped trie (HAMT)</a></li>
          <li><a href="#closing-thoughts" id="markdown-toc-closing-thoughts">Closing thoughts</a></li>
        </ul>
      </li>
      <li><a href="#️-olivia-quinet-applied-modern-c--beyond-type-erasure-and-visitor-design-patterns" id="markdown-toc-️-olivia-quinet-applied-modern-c--beyond-type-erasure-and-visitor-design-patterns">🗣️ Olivia Quinet: Applied modern c++ : beyond type-erasure and visitor design patterns</a>        <ul>
          <li><a href="#key-ideas" id="markdown-toc-key-ideas">Key ideas</a></li>
          <li><a href="#revisiting-design-patterns" id="markdown-toc-revisiting-design-patterns">Revisiting design patterns</a></li>
          <li><a href="#combining-type-erasure-and-visitor-patterns-olivias-hybrid-approach" id="markdown-toc-combining-type-erasure-and-visitor-patterns-olivias-hybrid-approach">Combining type-erasure and visitor patterns: Olivia’s hybrid approach</a></li>
          <li><a href="#lessons-learned" id="markdown-toc-lessons-learned">Lessons learned</a></li>
        </ul>
      </li>
      <li><a href="#️-kate-gregory-the-aging-programmer" id="markdown-toc-️-kate-gregory-the-aging-programmer">🗣️ Kate Gregory: The Aging Programmer</a>        <ul>
          <li><a href="#about-health-body-and-mind" id="markdown-toc-about-health-body-and-mind">About health: <strong>body</strong> and <strong>mind</strong></a></li>
          <li><a href="#addressing-challenges-in-the-workplace" id="markdown-toc-addressing-challenges-in-the-workplace">Addressing challenges in the Workplace</a></li>
          <li><a href="#building-a-long-happy-career-and-life" id="markdown-toc-building-a-long-happy-career-and-life">Building a long, happy career <strong>and</strong> life</a></li>
          <li><a href="#the-upsides-of-aging" id="markdown-toc-the-upsides-of-aging">The upsides of aging</a></li>
          <li><a href="#kates-core-advices" id="markdown-toc-kates-core-advices">Kate’s core advices</a></li>
        </ul>
      </li>
      <li><a href="#️-peter-muldoon-software-engineering-completeness--knowing-when-you-are-done-and-why-it-matters-" id="markdown-toc-️-peter-muldoon-software-engineering-completeness--knowing-when-you-are-done-and-why-it-matters-">🗣️ Peter Muldoon: Software Engineering Completeness : Knowing when you are Done and Why it matters ?</a>        <ul>
          <li><a href="#about-the-definition-of-done-dod" id="markdown-toc-about-the-definition-of-done-dod">About the definition of <strong>done</strong> (DoD)</a></li>
          <li><a href="#software-value-customer-vs-engineering-perspectives" id="markdown-toc-software-value-customer-vs-engineering-perspectives">Software value: customer vs. engineering perspectives</a></li>
          <li><a href="#delivering-changes-to-production" id="markdown-toc-delivering-changes-to-production">Delivering changes to production</a></li>
          <li><a href="#about-acceptance-criterias-ac" id="markdown-toc-about-acceptance-criterias-ac">About acceptance criterias (AC)</a></li>
          <li><a href="#problem-domains--complexity" id="markdown-toc-problem-domains--complexity">Problem domains &amp; complexity</a></li>
          <li><a href="#time-scope-and-estimates" id="markdown-toc-time-scope-and-estimates">Time, scope, and estimates</a></li>
          <li><a href="#are-we-done-yet--the-software-engineering-completeness-pyramid" id="markdown-toc-are-we-done-yet--the-software-engineering-completeness-pyramid">Are we done yet ? The software-engineering completeness pyramid</a></li>
          <li><a href="#code-health-refactoring-decommissioning-and-technical-debt" id="markdown-toc-code-health-refactoring-decommissioning-and-technical-debt">Code health: refactoring, decommissioning, and technical debt</a></li>
          <li><a href="#testing-and-sustainability" id="markdown-toc-testing-and-sustainability">Testing and sustainability</a></li>
          <li><a href="#conclusion-3" id="markdown-toc-conclusion-3">Conclusion</a></li>
        </ul>
      </li>
      <li><a href="#️-nico-heidtke-growing-pains---lessons-from-seeing-codebases-mature" id="markdown-toc-️-nico-heidtke-growing-pains---lessons-from-seeing-codebases-mature">🗣️ Nico Heidtke: Growing Pains - Lessons from Seeing Codebases Mature</a>        <ul>
          <li><a href="#team-related-challenges" id="markdown-toc-team-related-challenges">Team-related challenges</a></li>
          <li><a href="#codebase-layout--conventions" id="markdown-toc-codebase-layout--conventions">Codebase layout &amp; conventions</a></li>
          <li><a href="#knowledge-transfer--documentation" id="markdown-toc-knowledge-transfer--documentation">Knowledge transfer &amp; documentation</a></li>
          <li><a href="#development-tools--automation" id="markdown-toc-development-tools--automation">Development tools &amp; automation</a></li>
          <li><a href="#managing-dependencies--abstractions" id="markdown-toc-managing-dependencies--abstractions">Managing dependencies &amp; abstractions</a></li>
          <li><a href="#interoperability--localization" id="markdown-toc-interoperability--localization">Interoperability &amp; localization</a></li>
          <li><a href="#conclusion-4" id="markdown-toc-conclusion-4">Conclusion</a></li>
        </ul>
      </li>
      <li><a href="#️-herb-sutter-peering-forward---cs-next-decade" id="markdown-toc-️-herb-sutter-peering-forward---cs-next-decade">🗣️ Herb Sutter: Peering forward - C++’s next decade</a>        <ul>
          <li><a href="#reflection" id="markdown-toc-reflection">Reflection</a></li>
          <li><a href="#safety" id="markdown-toc-safety">Safety</a></li>
          <li><a href="#simplicity-through-generalization" id="markdown-toc-simplicity-through-generalization">Simplicity, through generalization</a></li>
          <li><a href="#looking-ahead" id="markdown-toc-looking-ahead">Looking ahead</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#-11162024" id="markdown-toc--11162024">📅 11/16/2024</a>    <ul>
      <li><a href="#️-rainer-grimm-an-overview-on-the-c26-highlights" id="markdown-toc-️-rainer-grimm-an-overview-on-the-c26-highlights">🗣️ Rainer Grimm: An overview on the C++26 highlights</a>        <ul>
          <li><a href="#reflection-1" id="markdown-toc-reflection-1">Reflection</a></li>
          <li><a href="#contracts" id="markdown-toc-contracts">Contracts</a></li>
          <li><a href="#placeholders" id="markdown-toc-placeholders">Placeholders</a></li>
          <li><a href="#static-assertions" id="markdown-toc-static-assertions">Static assertions</a></li>
          <li><a href="#templates-parameter-pack-indexing" id="markdown-toc-templates-parameter-pack-indexing">Templates parameter pack indexing</a></li>
          <li><a href="#deletereason" id="markdown-toc-deletereason"><code class="language-plaintext highlighter-rouge">delete(reason)</code></a></li>
          <li><a href="#string-likes-improvements" id="markdown-toc-string-likes-improvements">String-likes improvements</a></li>
          <li><a href="#stdinplace_vector" id="markdown-toc-stdinplace_vector"><code class="language-plaintext highlighter-rouge">std::inplace_vector</code></a></li>
          <li><a href="#stdformat" id="markdown-toc-stdformat"><code class="language-plaintext highlighter-rouge">std::format</code></a></li>
          <li><a href="#ranges" id="markdown-toc-ranges"><code class="language-plaintext highlighter-rouge">&lt;ranges&gt;</code></a></li>
          <li><a href="#more-constexpr-support" id="markdown-toc-more-constexpr-support">More <code class="language-plaintext highlighter-rouge">constexpr</code> support</a></li>
          <li><a href="#stdsubmdspan" id="markdown-toc-stdsubmdspan"><code class="language-plaintext highlighter-rouge">std::submdspan</code></a></li>
          <li><a href="#debugging-support" id="markdown-toc-debugging-support">Debugging support</a></li>
          <li><a href="#stdexecution-senderreceiver" id="markdown-toc-stdexecution-senderreceiver"><code class="language-plaintext highlighter-rouge">std::execution</code> (sender/receiver)</a></li>
        </ul>
      </li>
      <li><a href="#️-frances-buontempo-an-introduction-to-swarm-intelligence-algos" id="markdown-toc-️-frances-buontempo-an-introduction-to-swarm-intelligence-algos">🗣️ Frances Buontempo: An introduction to swarm intelligence algos</a>        <ul>
          <li><a href="#what-is-swarm-intelligence-" id="markdown-toc-what-is-swarm-intelligence-">What is swarm intelligence ?</a></li>
          <li><a href="#particle-swarm-optimization-pso" id="markdown-toc-particle-swarm-optimization-pso">Particle Swarm Optimization (PSO)</a></li>
          <li><a href="#ant-colony-optimization-aco" id="markdown-toc-ant-colony-optimization-aco">Ant Colony Optimization (ACO)</a></li>
          <li><a href="#abstract-bee-colony-abc" id="markdown-toc-abstract-bee-colony-abc">Abstract Bee Colony (ABC)</a></li>
          <li><a href="#cat-swarm-optimization-cso" id="markdown-toc-cat-swarm-optimization-cso">Cat Swarm Optimization (CSO)</a></li>
          <li><a href="#implementation--demonstrations" id="markdown-toc-implementation--demonstrations">Implementation &amp; demonstrations</a></li>
        </ul>
      </li>
      <li><a href="#️-timur-doumler-contracts-for-c" id="markdown-toc-️-timur-doumler-contracts-for-c">🗣️ Timur Doumler: Contracts for C++</a>        <ul>
          <li><a href="#what-are-contracts-and-why-do-they-matter-" id="markdown-toc-what-are-contracts-and-why-do-they-matter-">What are contracts and why do they matter ?</a></li>
          <li><a href="#the-purpose-of-contracts" id="markdown-toc-the-purpose-of-contracts">The purpose of contracts</a></li>
          <li><a href="#p2900-main-features" id="markdown-toc-p2900-main-features"><strong>P2900</strong> main features</a></li>
          <li><a href="#practical-implementation-and-integration" id="markdown-toc-practical-implementation-and-integration">Practical implementation and integration</a></li>
          <li><a href="#evaluation-semantics" id="markdown-toc-evaluation-semantics">Evaluation semantics</a></li>
          <li><a href="#challenges--limitations" id="markdown-toc-challenges--limitations">Challenges &amp; limitations</a></li>
          <li><a href="#conclusion--takeaway" id="markdown-toc-conclusion--takeaway">Conclusion / takeaway</a></li>
        </ul>
      </li>
      <li><a href="#️-jens-weller-meeting-c-update" id="markdown-toc-️-jens-weller-meeting-c-update">🗣️ Jens Weller: Meeting C++ update</a>        <ul>
          <li><a href="#meeting-c-20" id="markdown-toc-meeting-c-20">Meeting C++ 2.0</a></li>
          <li><a href="#the-meeting-c-conference" id="markdown-toc-the-meeting-c-conference">The Meeting C++ conference</a></li>
          <li><a href="#future-vision-meeting-c-30" id="markdown-toc-future-vision-meeting-c-30">Future vision: Meeting C++ 3.0</a></li>
        </ul>
      </li>
      <li><a href="#-secrets-lightning-talks" id="markdown-toc--secrets-lightning-talks">⚡ Secrets Lightning talks</a>        <ul>
          <li><a href="#-ivan-cukic---a-brave-new-world" id="markdown-toc--ivan-cukic---a-brave-new-world">⚡ Ivan Cukic - a brave new world</a></li>
          <li><a href="#-hana-dusikova---hashing" id="markdown-toc--hana-dusikova---hashing">⚡ Hana Dusikova - Hashing</a></li>
          <li><a href="#-james-mcnellis---my-least-favorite-c-feature" id="markdown-toc--james-mcnellis---my-least-favorite-c-feature">⚡ James Mc.Nellis - My <strong>least</strong> favorite C++ feature</a></li>
          <li><a href="#-phil-nash---live-demo-using-undoio-tool-on-doom" id="markdown-toc--phil-nash---live-demo-using-undoio-tool-on-doom">⚡ Phil Nash - Live Demo using <code class="language-plaintext highlighter-rouge">Undo.io</code> tool on <code class="language-plaintext highlighter-rouge">Doom</code></a></li>
          <li><a href="#-titus-winters---on-parameter-sinks" id="markdown-toc--titus-winters---on-parameter-sinks">⚡ Titus Winters - On parameter sinks</a></li>
          <li><a href="#-jens-weller---networking" id="markdown-toc--jens-weller---networking">⚡ Jens Weller - Networking</a></li>
        </ul>
      </li>
      <li><a href="#️-peter-sommerlad-collective-amnesia" id="markdown-toc-️-peter-sommerlad-collective-amnesia">🗣️ Peter Sommerlad: Collective Amnesia?</a>        <ul>
          <li><a href="#why-do-we-forget-" id="markdown-toc-why-do-we-forget-">Why do we forget ?</a></li>
          <li><a href="#forgotten-foundations" id="markdown-toc-forgotten-foundations">Forgotten foundations</a></li>
          <li><a href="#software-architecture-and-design-patterns" id="markdown-toc-software-architecture-and-design-patterns">Software architecture and design patterns</a></li>
          <li><a href="#the-c-type-system-as-a-key-tool" id="markdown-toc-the-c-type-system-as-a-key-tool">The C++ type system as a key tool</a></li>
          <li><a href="#best-practices" id="markdown-toc-best-practices">Best practices</a></li>
          <li><a href="#conclusion-key-takeaway-and-broader-thoughts" id="markdown-toc-conclusion-key-takeaway-and-broader-thoughts">Conclusion, key takeaway, and broader thoughts</a></li>
          <li><a href="#additional-inputs-from-questions" id="markdown-toc-additional-inputs-from-questions">Additional inputs from questions</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#conclusion-5" id="markdown-toc-conclusion-5">Conclusion</a></li>
</ul>

<h2 id="introduction">Introduction</h2>

<p>Today marks the beginning of the 2024 edition of the <strong>MeetingCpp</strong> conference, running from November 14th to November 16th.<br />
As a dedicated C++ enthusiast, I’m excited to seize this opportunity to explore emerging trends, deepen my knowledge, and gain insights from leading experts in the field.<br />
Over the next three days, I look forward to expanding my perspectives and enhancing my understanding through a diverse lineup of talks and discussions.</p>

<p>This year, the MeetingCpp conference adopted a <strong>hybrid model</strong>, combining an onsite event in Berlin with remote participation through the <a href="https://events.hubilo.com/meeting-cpp-2024">Hubilo</a> platform<br />
<em>(As opposed to the <a href="https://gist.github.com/GuillaumeDua/b354dd4c46df160dbfd04c31b2a51c80">2021 edition (see my trip report here)</a> with was purely online because of the pandemic)</em>.</p>

<p>Notably, this year also marks the <strong>10th anniversary</strong> of the conference taking place in Berlin <em>(and the 13th overall anniversary)</em>, a significant milestone in bringing the C++ community together to meet, share and grow.</p>

<p>While I’m attending the conference remotely and will miss the in-person experience (socializing &amp; drinks),<br />
I’m grateful to <a href="https://www.fairmat.tech/">Fairmat</a> for sponsoring my participation at the conference this year.<br />
Their support allows me to stay engaged with the latest in C++ and continue growing professionally.</p>

<p>With <a href="https://meetingcpp.com/mcpp/schedule/">multiple tracks running simultaneously</a>, it’s always a challenge - <em>if not a dilema</em> - to decide which talks to attend to.<br />
The diverse lineup makes it difficult to choose, as each session offers unique insights and learning opportunities from interesting speakers.
There’s a well-known French saying, often attributed to <a href="https://fr.wikipedia.org/wiki/Andr%C3%A9_Gide">André Gide</a>, that perfectly captures how I feel when planning my attendance at any conference: <em>“Choisir, c’est renoncer.”</em>.<br />
It translates to <em>“To choose is to give up”</em> - on all the other options.</p>

<p><em>For the sake of completeness, the only issues occurred on day 2: a minor audio glitch on Track C at 2 PM and a brief streaming issue during Herb’s talk.</em></p>

<h3 id="personnal-thoughts-about-the-conference">Personnal thoughts about the conference</h3>

<p>I particularly enjoyed talks/keynotes from Titus Winters, Peter Muldoon, and Peter Sommerlad, as they resonated deeply with the practices I advocate for on daily basis.<br />
From my perspective, <em>much like Kate Gregory’s talks</em>, this is a must-watch for everyone in the tech industry.<br />
Their insights not only reinforced my beliefs but also added fresh perspectives and valuable details, enriching my understandings,<br />
as I have been working on writing on a book about related topics since the first French COVID lockdown <em>(A pragmatic approach of software development &amp; project management: humans, tech-debt, decision-making, etc.)</em>.<br />
It will influence how I approach team leadership and technical decision-making moving forward, to help build a more resilient, collaborative, and effective team culture while driving sustainable technical success.</p>

<blockquote>
  <p>The slides from most keynotes &amp; talks of the conference are already <a href="https://meetingcpp.com/mcpp/slides/?year=2024">available here</a>,<br />
while videos are already being uploaded on the <a href="https://www.youtube.com/@MeetingCPP/videos">MeetingCPP youtube channel</a>.</p>
</blockquote>

<h3 id="disclaimer">Disclaimer</h3>

<p>The last time I wrote a trip report, someone from the C++FrUG (C++ French User Group) playfully teased me,<br />
saying: <em>“This isn’t a report; but the entire trip!”</em>.</p>

<p>He wasn’t wrong: this document is more of a detailed transcription of all the notes I took.<br />
It helps me stay focused and retain information during talks, countering any tendencies toward distraction.</p>

<p>While this is primarily a resource for my future self to easily revisit and retrieve specific details,<br />
I hope reading this will also be profitable to you - <em>dear reader</em> - in some way.</p>

<hr />

<h2 id="-11142024">📅 11/14/2024</h2>

<h3 id="️-jens-weller-welcome-message">🗣️ <strong>Jens Weller</strong>: Welcome Message</h3>

<p>The conference began with a warm welcome from Jens Weller, the founder and organizer of Meeting-C++.<br />
In his address, Jens reflected on the journey of the conference, marking its 13th anniversary and the 10th taking place in Berlin, <em>despite the new Berlin COVID variant</em>.</p>

<h3 id="️-titus-winters-opening-keynote---fear-in-tech">🗣️ <strong>Titus Winters</strong>: Opening Keynote - Fear in tech</h3>

<p><a href="https://www.youtube.com/watch?v=_dLLIjKz9MY">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2024/Fear%20in%20Tech803284.pdf">📄 slidedeck</a>.</p>

<blockquote>
  <p>In a nuthshell:</p>

  <ul>
    <li><em>“No code in this talk. The ones who are disappointed can leave now”</em></li>
    <li><code class="language-plaintext highlighter-rouge">Software engineering == programming x time x people</code></li>
    <li>Tech isnt just computers, it’s also <strong>peoples</strong>. With weaknesses, feelings.</li>
  </ul>
</blockquote>

<hr />

<p>Titus Winters delivered a thoughts-provoking keynote that focused not on technical details, but on the emotional and human aspects of software development.<br />
At a C++ conference, this was a bold and refreshing approach, which made me think of some Kate Gregory’s talks.</p>

<p>By addressing <strong>fear</strong>, <strong>anxiety</strong>, and promoting <strong>psychological safety</strong> within teams,<br />
Titus emphasized the importance of <strong>culture</strong>, <strong>communication</strong>, and <strong>trust</strong> in building <strong>sustainable</strong> software and effective teams.</p>

<h4 id="psychological-safety-over-fear--anxiety"><strong>Psychological safety</strong> over <strong>fear</strong> &amp; <strong>anxiety</strong></h4>

<p>Fear of mistakes, judgment, and uncertainty can cripple team dynamics and innovation.<br />
Effective <strong>tools</strong>, <strong>processes</strong>, and <strong>open communication</strong> are essential for reducing these anxieties.<br />
The best teams foster an environment where members <strong>feel safe</strong> to admit mistakes, ask questions, and share feedback.<br />
Trust and openness outweigh technical expertise alone.</p>

<ul>
  <li>
    <p>Creating a <strong>psychologically safe environment</strong></p>

    <p>Encouraging open feedback, where team members can give and receive constructive input, and openly share mistakes without shame, as a cathartic but also information-sharing process.</p>
  </li>
  <li>
    <p><strong>Reducing fear and control-driven behaviors</strong></p>

    <p>Addressing hypes, <a href="https://en.wikipedia.org/wiki/Fear_of_missing_out">fear of missing out (FOMO)</a>, and authoritarian power, leads to decisions that lack rational grounding.</p>
  </li>
  <li>
    <p><strong>Ensuring recognition</strong> of technical efforts</p>

    <p>Bridging the perception gap between managers (~90% acknowledgment) and individual contributors (~25%) by making sure all work is visible and appreciated.</p>
  </li>
</ul>

<h4 id="culture-is-key"><strong>Culture</strong> is key</h4>

<p>Organizational culture directly impacts 30% or more of a team’s - <em>thus projects</em> - success.<br />
Writing down shared values and expectations, rather than relying on unspoken rules, promotes clarity and reduces fear.</p>

<ul>
  <li>
    <p>Fostering a <strong>culture of gratitude</strong></p>

    <p>Actively promoting a <strong><em>“thanks culture”</em></strong> to acknowledge individual contributions and strengthen team cohesion.</p>
  </li>
  <li>
    <p>Rely on <strong>truth and facts</strong></p>

    <p>Leverage <strong>tools to reduce uncertainty</strong>: Integrating and relying on tools as formal sources of truth to enhance <strong>predictability and confidence</strong>, and to reduce anxiety.<br />
[A.N] <em>“Facts over beliefs”</em> is probably the phrase I say most often. Using more tools will help me avoid becoming an authority figure.</p>
  </li>
</ul>

<h4 id="learning-and-growth-as-a-team"><strong>Learning</strong> and growth as a team</h4>

<p>Continuous learning isn’t a luxury-it’s a necessity.<br />
Senior team members should lead by fostering <strong>knowledge-sharing</strong> and ensuring others grow alongside them.</p>

<ul>
  <li>
    <p>Supporting <strong>team growth</strong></p>

    <p>Providing clear guidance and mentorship to help team members ramp up effectively and feel supported.</p>
  </li>
</ul>

<h4 id="sustainability-in-software"><strong>Sustainability</strong> in software</h4>

<p>Fear-driven decisions lead to unsustainable systems <em>(e.g: tech-debt, etc.)</em>, where change becomes risky or impossible.<br />
Sustainable projects must adapt to new challenges without fear of failure.</p>

<ul>
  <li>
    <p>Prioritizing <strong>sustainable practices</strong></p>

    <p>Incorporating <strong>cleanup strategies</strong> and <strong>technical debt mitigation</strong> into regular workflows to maintain long-term project health.</p>
  </li>
  <li>
    <p><strong>Avoiding hype cycles and buzzwords</strong></p>

    <p>Maintaining a critical perspective to ensure decisions are based on practical utility rather than fleeting trends.</p>
  </li>
  <li>
    <p><strong>Reducing decision-making biases</strong></p>

    <p>Striving for fair, balanced, and inclusive decisions that minimize subjective biases.</p>
  </li>
  <li>
    <p>Focusing on <strong>meaningful progress</strong></p>

    <p>Emphasizing that speed is not equivalent to velocity and prioritizing long-term impact over short-term gains.</p>
  </li>
</ul>

<h4 id="conclusion">Conclusion</h4>

<p>This keynote was a powerful reminder of the <strong>human factor</strong>/elements in software engineering, beyond code.<br />
As a lead developer, I recognize the importance of <strong>fostering psychological safety</strong> within my team, encouraging <strong>open communication</strong>, and focusing on <strong>sustainable practices</strong>.</p>

<h3 id="️-andreas-weis-c-modules---getting-started-today">🗣️ <strong>Andreas Weis</strong>: C++ Modules - Getting Started Today</h3>

<p><a href="https://www.youtube.com/watch?v=NI7dAiWwibY">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2024/C++%20Modules%20-%20Getting%20Started%20Today731788.pdf">📄 slidedeck</a>.</p>

<hr />

<blockquote>
  <p>Hello world example <a href="https://godbolt.org/z/Ea54d1Ta3">available here on compiler-explorer</a>.<br />
Ref. to Daniela Engert “The three secrets spices of C++ Modules - Visibility, Reachability, Linkage”</p>
</blockquote>

<p>Andreas Weis provided an insightful deep dive into named <strong>modules</strong>,<br />
offering a practical perspective on how they improve upon traditional header-based C++ code organization.</p>

<h4 id="includes-limitations">Includes limitations</h4>

<ul>
  <li>
    <p><strong>Lack of structure</strong></p>

    <p>Includes can occur anywhere, even in the middle of a function body, which can lead to confusion.</p>
  </li>
  <li>
    <p><strong>Inter-dependency</strong></p>

    <p>Headers are not required to be self-contained, which can leads to unexpected situations where the orders matter somehow.</p>
  </li>
  <li>
    <p><strong>Redundant compilation</strong></p>

    <p>Each translation unit re-compiles included files, leading to inefficiency.</p>
  </li>
</ul>

<h4 id="how-modules-address-such-issues">How modules address such issues</h4>

<p>A module is a <strong>self-contained</strong> unit of code, explicitly declaring what it exports.<br />
Modules separate <strong>visibility</strong> and <strong>reachability</strong>: non-exported entities are still visible within the module but inaccessible externally.
However, modules are still vulnerable to <a href="https://en.cppreference.com/w/cpp/language/definition">ODR</a> violations.</p>

<h4 id="challenges-in-adopting-modules">Challenges in adopting modules</h4>

<p>Importance of using the latest tools, which have still plenty of bugs and inconsistent behaviors.</p>

<ul>
  <li><a href="https://cmake.org/">CMake</a>: at least 3.28. And at least cmake &gt;= 3.30 for <code class="language-plaintext highlighter-rouge">import std</code>.</li>
  <li><a href="https://ninja-build.org/manual.html">Ninja</a> 1.11</li>
  <li><a href="https://clang.llvm.org/">Clang</a> 19</li>
  <li><a href="https://gcc.gnu.org/">GCC</a> 14, but consider using <code class="language-plaintext highlighter-rouge">trunk</code></li>
</ul>

<p>About mixing headers and modules</p>

<ul>
  <li>Mixing traditional headers with modules can lead to unexpected results.<br />
Best practices include importing headers at the global fragment or using modularized legacy libraries <em>(best world: no more include files)</em>.</li>
  <li>Preprocessor directives cannot be exported, necessitating constexpr replacements.</li>
</ul>

<h4 id="practical-advice-for-getting-started">Practical advice for getting started</h4>

<ul>
  <li>Use modules as self-contained units and minimize reliance on header files.</li>
  <li>Sticking with the <code class="language-plaintext highlighter-rouge">.cpp</code> extension for module files to maintain compatibility with build systems.</li>
  <li>Modularize legacy libraries by exporting names explicitly or detaching specific elements from the module.</li>
  <li>Always include the standard library before modularizing legacy code.</li>
</ul>

<h4 id="conclusion-1">Conclusion</h4>

<p>Modules represent a significant shift in how C++ codebases are structured, aiming to improve scalability, compile-time performance, and maintainability.<br />
Although the tooling ecosystem is still evolving, these advancements promise a more efficient and less error-prone development experience.</p>

<h3 id="️-philipp-dominik-schubert-the-notorious-bug---the-most-popular-bugs-and-code-smells-in-c-and-c">🗣️ <strong>Philipp Dominik Schubert</strong>: The Notorious B.U.G. - The Most Popular Bugs and Code Smells in C and C++</h3>

<p><a href="https://meetingcpp.com/mcpp/slides/2024/the_notorious_bug769726.pdf">📄 Slidedeck</a>.</p>

<hr />

<p>Philipp Dominik Schubert (<a href="https://www.sonarsource.com/">Sonar</a>) explored the most prevalent bugs and code smells in C and C++, leveraging <a href="https://www.sonarsource.com/">Sonar</a>’s tools and insights.<br />
He offered practical advices on identifying and addressing common pitfalls, tooling, and modern C++ best-practices.</p>

<h4 id="bug-hunting-at-sonar">Bug hunting at <strong>Sonar</strong></h4>

<ul>
  <li>
    <p><a href="https://www.sonarsource.com/">Sonar</a> aims to detect issues in C and C++ code by applying a set of predefined rules that describe undesirable patterns or constructs. These rules are implemented through a combination of:</p>

    <ul>
      <li><strong>AST matchers</strong> (Abstract Syntax Trees), which can be use like <a href="https://godbolt.org/z/9qEdrsjaq">this in compiler-explorer</a>.<br />
<em>(In compiler-explorer: source editor panel &gt; ‘+’ &gt; compiler &gt; compiler panel &gt; ‘+’ &gt; AST)</em>
        <ul>
          <li>as a C++ DSL to query LLVM’s AST for patterns.</li>
        </ul>
      </li>
      <li><strong>Symbolic execution</strong>
        <ul>
          <li>Simulates execution to analyze control flow paths and states, performing a path-by-path analysis<br />
(as opposed to merge-first data-flow analysis)</li>
          <li>Evaluates control flow, state constraints, and path conditions.</li>
          <li>Unknown values
            <ul>
              <li>Are evaluated as symbols</li>
              <li>branches and post-conditions used to contrain values</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>Static analysis tools:
        <ul>
          <li>Identify error-prone paths using <code class="language-plaintext highlighter-rouge">clang --analyze -Xclang -analyzer-checker=core</code>, etc..</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h4 id="challenges-while-detecting-bugs">Challenges while detecting bugs</h4>

<ul>
  <li>Exponential path explosion: 2^𝑁 paths for 𝑁 branches in the worst case.</li>
  <li><a href="https://en.wikipedia.org/wiki/Rice%27s_theorem">Rice’s theorem <em>(1951, his doctoral dissertation at Syracuse University)</em></a>: All non-trivial properties of programs are <strong>undecidable</strong>.</li>
  <li>Balancing precision (false negatives) and recall (false positives) remains a significant hurdle.</li>
</ul>

<p>See a live demonstration <a href="https://godbolt.org/z/KzoTvsnz9">here on compiler-explorer</a>.</p>

<h4 id="top-10-bugs-and-code-smells-in-c">Top 10 bugs and code smells in C++</h4>

<ul>
  <li>
    <p>Uninitialized variables</p>

    <ul>
      <li>One should always initialize variables.</li>
      <li>
        <p>Turn compiler warnings on: <code class="language-plaintext highlighter-rouge">-Wall -Werror</code>,<br />
even if it might not help in some cases:</p>

        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">magic_init</span><span class="p">(</span><span class="kt">int</span> <span class="o">&amp;</span><span class="p">)</span>
<span class="kt">int</span> <span class="n">func</span><span class="p">(){</span>
  <span class="kt">int</span> <span class="n">a</span><span class="p">;</span>
  <span class="n">magic_init</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
  <span class="k">return</span> <span class="n">a</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>        </div>
      </li>
      <li>Use default initialization when you can</li>
      <li>Be careful with default constructors, even with PODs members</li>
      <li>
        <p>Use IILE for non-trivial initializations</p>

        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">a</span><span class="p">{};</span>
<span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">]{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">cond</span><span class="p">())</span> <span class="k">return</span> <span class="mi">42</span><span class="p">;</span>
  <span class="k">return</span> <span class="mi">9001</span><span class="p">;</span>
<span class="p">}();</span>

<span class="k">auto</span> <span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">]{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">make_tuple</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
  <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">make_tuple</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li>
    <p>Buffer overflows</p>

    <ul>
      <li>Avoid C-style arrays. Prefer <code class="language-plaintext highlighter-rouge">std::array</code>, <code class="language-plaintext highlighter-rouge">std::vector</code>, <code class="language-plaintext highlighter-rouge">std::string</code>, or <code class="language-plaintext highlighter-rouge">std::inplace_vector</code>.</li>
      <li>Use range-based for-loops and <code class="language-plaintext highlighter-rouge">&lt;algorithm&gt;</code>, and <code class="language-plaintext highlighter-rouge">&lt;range&gt;</code>
        <ul>
          <li>For indexes, use <code class="language-plaintext highlighter-rouge">std::views::enumerate</code>: <code class="language-plaintext highlighter-rouge">const auto [index, value]: std::views::enumerate(range_value)</code></li>
        </ul>
      </li>
      <li>Mitigate risks inherent to legacy code by using tools: sanitizers, <code class="language-plaintext highlighter-rouge">FORTIFY_SOURCE</code>, stack canaries, ASLR <em>(address space layout randomization)</em>, and fuzzing.</li>
    </ul>
  </li>
  <li>
    <p>Null pointer dereferences</p>

    <ul>
      <li>Prefer references over pointers.</li>
      <li>Always check for <code class="language-plaintext highlighter-rouge">nullptr</code> before dereferencing.</li>
      <li>Example: <a href="https://en.wikipedia.org/wiki/Tony_Hoare#Apologies_and_retractions">Tony Hoare</a>’s <a href="https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/">billion-dollar mistake</a> (null refs in <code class="language-plaintext highlighter-rouge">ALGOL</code>)</li>
    </ul>
  </li>
  <li>
    <p>Unreachable code</p>

    <ul>
      <li>Indicates logical flaws and confuses readers.</li>
      <li>Often hides untested and unmaintained chunks of code.</li>
      <li>Example: <a href="https://en.wikipedia.org/wiki/Apple_Inc.">Apple</a>’s infamous <a href="https://dwheeler.com/essays/apple-goto-fail.html"><code class="language-plaintext highlighter-rouge">goto fail;</code> bug</a>.</li>
    </ul>
  </li>
  <li>
    <p>Resource leaks</p>

    <ul>
      <li>Avoid manual memory management: prefer smart pointers and containers.</li>
      <li>Use <a href="https://en.cppreference.com/w/cpp/language/raii">RAII idiom</a>.</li>
      <li>Use semantic: <code class="language-plaintext highlighter-rouge">std::move</code> to transfert ownership/resources, <code class="language-plaintext highlighter-rouge">const</code>-qualified types for read-only access.</li>
    </ul>
  </li>
  <li>
    <p>Identical binary operator expressions</p>

    <ul>
      <li>Often a sign of copy-pasted errors.</li>
      <li>logical expressions can be tricky: simplify it, and use tools when it’s too complicated.</li>
    </ul>
  </li>
  <li>
    <p>Incorrect return values</p>

    <ul>
      <li>Ensure functions return - <em>appropriate</em> - values on all paths.</li>
      <li>Add compiler warnings (<code class="language-plaintext highlighter-rouge">-Wall</code>, <code class="language-plaintext highlighter-rouge">-Wreturn-type</code>, and consider using<code class="language-plaintext highlighter-rouge">-Werror</code>)</li>
      <li>Use attributes like <code class="language-plaintext highlighter-rouge">[[noreturn]]</code>, <code class="language-plaintext highlighter-rouge">[[nodiscard]]</code>.</li>
    </ul>
  </li>
  <li>
    <p>Identical branches</p>

    <ul>
      <li>Another indicator of logical flaws or copy-paste mistakes.</li>
    </ul>
  </li>
  <li>
    <p>Destructors throwing exceptions</p>

    <ul>
      <li>Destructors are implicitly <code class="language-plaintext highlighter-rouge">noexcept</code> since C++11.<br />
Throwing exceptions from destructors thus causes abrupt, unclean, implementation-defined termination, effectively calling <code class="language-plaintext highlighter-rouge">std::terminate</code>.</li>
      <li>Be extra careful with containers of objects</li>
    </ul>
  </li>
  <li>
    <p>Loops with at most one iteration</p>

    <ul>
      <li>Indicates serious logical flaws.</li>
      <li>Replace with <code class="language-plaintext highlighter-rouge">if</code>-statement for clarity.</li>
    </ul>
  </li>
</ul>

<h4 id="questioning-root-causes">Questioning root causes</h4>

<ul>
  <li><strong>Legacy code</strong>: Many bugs stem from outdated practices and lack of modern C++ features.</li>
  <li><strong>Teaching C++</strong> effectively: Are educators failing to teach best practices ?</li>
  <li><strong>Default behavior</strong>: Should C++ provide safer defaults, like mandatory zero-initialization ?</li>
</ul>

<h4 id="how-to-improve-code-quality-">How to improve code quality ?</h4>

<ul>
  <li>Adopt <strong>modern C++ practices</strong>: Use safer standard library types,<br />
effectively avoiding raw pointers and manual memory management.</li>
  <li>Use <strong>static and runtime analysis</strong> and other available <strong>tools</strong>:
    <ul>
      <li>Turn <strong>compilers warning</strong> on (<code class="language-plaintext highlighter-rouge">-Wall -Werror</code>) and use <strong>static analyzers</strong> for blind spots.</li>
      <li>Employ dynamic analysis tools like <strong>sanitizers</strong> (undefined behavior, address, memory, thread).</li>
      <li><strong>Test and validate</strong> your code by running your test suites with tools like <a href="https://valgrind.org/">valgrind</a> to catch runtime errors and race conditions.</li>
    </ul>
  </li>
  <li><strong>Express your intent</strong> clearly: Leverage attributes like [[nodiscard]], [[noreturn]], and [[maybe_unused]]</li>
</ul>

<p>As a conclusion, Philipp’s insights highlighted that while static analysis can’t solve every problems, combining modern C++ practices with effective tools can eliminate many common pitfalls.</p>

<h3 id="️-goran-aranđelović-introduction-to-senderreceiver-framework">🗣️ <strong>Goran Aranđelović</strong>: Introduction to Sender/Receiver framework</h3>

<blockquote>
  <p>Goran Aranđelović is a developer in the adtech industry, and founder of the C++ Serbia user group.</p>
</blockquote>

<p>In his talk, Goran underlined the differences between concepts often confused with each others: multithreading, concurrency and parallelism.</p>

<ul>
  <li>Concurrency: multiple computations at the same time. Processing tasks on 1 core result in a concurrent but not parallel execution.</li>
  <li>Parallelism: multiple calculations/processes running simultaneously. Processing taks on N cores can be concurrent and parallel.</li>
  <li>Compared to serial execution, concurrency requires stronger scheduling guarantees, and while parallelism requires weaker ones.</li>
  <li>In a nuthshell: concurrency encompass parallelism, while multithreading is a one of the way to achieve concurrency</li>
</ul>

<h4 id="why-do-we-need-such-a-new-framework-">Why do we need such a new framework ?</h4>

<ul>
  <li>C++11 introduced <code class="language-plaintext highlighter-rouge">std::thread</code>, <code class="language-plaintext highlighter-rouge">atomic</code>, <code class="language-plaintext highlighter-rouge">memory_order</code>, (recursive)<code class="language-plaintext highlighter-rouge">mutex</code>, <code class="language-plaintext highlighter-rouge">future</code>, <code class="language-plaintext highlighter-rouge">promise</code>, <code class="language-plaintext highlighter-rouge">async</code>, etc., but …
    <ul>
      <li>That was a while ago: we’d better clean up such primitives in our codebase</li>
      <li>We need to focus on expressing intents (what), not low-level implementation details (how)</li>
    </ul>
  </li>
</ul>

<p>What are the current proposals ?</p>

<ul>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4771.pdf">Networking TS (N4771)</a></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0443r13.html">Unified executors for C++ (P0443R13)</a></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html"><code class="language-plaintext highlighter-rouge">std::execution</code> (Senders &amp; Receivers, P2300R10)</a></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2762r2.pdf">Sender/Receiver interface for networking (P2762)</a></li>
</ul>

<p>What is the current available implementation ?</p>

<ul>
  <li><a href="https://github.com/NVIDIA/stdexec">Nvidia’s stdexec</a></li>
</ul>

<h4 id="introducing-senders--receivers-as-described-in-p2300">Introducing senders &amp; receivers, as described in P2300</h4>

<p>Key ideas:</p>

<ul>
  <li>A self-contained design for managing asynchronous execution on generic execution resources.</li>
  <li>An idiomatic way of expressing async work in C++.</li>
  <li>Provides unified, high level abstractions, effectively enabling async API composition</li>
</ul>

<p>Core concepts:</p>

<ul>
  <li><strong>Schedulers</strong>: Lightweight handle that represent strategies for scheduling work on an execution resources (e.g., CPU, GPU).</li>
  <li><strong>Senders</strong>: Describe some work to be done, as a monad.
    <ul>
      <li>A sender can be choosed at runtime</li>
    </ul>
  </li>
  <li><strong>Receivers</strong>: Multiple channels callbacks:
    <ul>
      <li>Value (results).</li>
      <li>Error (exceptions).</li>
      <li>Stopped (cancellations).</li>
    </ul>
  </li>
</ul>

<p>Minimal control flow API:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">stdexec::on</code>: Specify where the work is executed.</li>
  <li><code class="language-plaintext highlighter-rouge">stdexec::just</code>: Lift a concret value into a sender.<br />
 <em>Equivalent to <code class="language-plaintext highlighter-rouge">pure</code> in Haskell</em>.</li>
  <li><code class="language-plaintext highlighter-rouge">stdexec::then</code>: Continuation: chain computations with transformed value from previous sender.
<em>Equivalent to <code class="language-plaintext highlighter-rouge">fmap</code> in Haskell</em>.</li>
  <li><code class="language-plaintext highlighter-rouge">stdexec::let_value(F)</code>: Dynamically choose a sender at runtime.<br />
(<code class="language-plaintext highlighter-rouge">F</code> is an runtime invocable which returns a sender)</li>
  <li><code class="language-plaintext highlighter-rouge">stdexec::sync_wait</code>: Block and wait for the result.</li>
</ul>

<h4 id="advantages-of-senders--receivers-when-compared-with-existing-models">Advantages of senders &amp; receivers when compared with existing models</h4>

<p>See a complete example <a href="https://godbolt.org/z/r731KWWPn">here on compiler-explorer</a>.</p>

<ul>
  <li>straight-forward</li>
  <li>Combines async tasks without the overhead of allocations, synchronization, or type erasure.</li>
  <li>Composition and blocking <em>(<code class="language-plaintext highlighter-rouge">sync_wait</code>)</em> are standard, generic algorithms.</li>
  <li>Replace/unifies heterogeneous/disparate async APIs, enabling greater interoperability.</li>
  <li>
    <p>Example</p>

    <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">auto</span> <span class="n">s1</span> <span class="o">=</span> <span class="n">then</span><span class="p">(</span><span class="n">just</span><span class="p">(</span><span class="mi">42</span><span class="p">),</span> <span class="p">[](</span><span class="kt">int</span> <span class="n">i</span><span class="p">){</span> <span class="k">return</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="p">});</span>
<span class="k">auto</span> <span class="n">op1</span> <span class="o">=</span> <span class="n">stdexec</span><span class="o">::</span><span class="n">connect</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">print_receiver</span><span class="p">{});</span>
<span class="n">stdexec</span><span class="o">::</span><span class="n">start</span><span class="p">(</span><span class="n">op1</span><span class="p">)</span>
</code></pre></div>    </div>
  </li>
</ul>

<h4 id="senders--receivers-are-not-a-replacement-for-coroutines">Senders &amp; Receivers are not a replacement for coroutines</h4>

<p>They complement each other:</p>

<ul>
  <li>All awaitables are senders.</li>
  <li>Many senders can trivially be made awaitable.</li>
</ul>

<h4 id="key-takeaways">Key takeaways</h4>

<ul>
  <li>The sender/receiver framework simplifies and standardizes asynchronous programming in C++.</li>
  <li>It encourages writing clean, composable, and efficient code for managing async workflows.</li>
</ul>

<h3 id="️-klaus-iglberger-there-is-no-silver-bullet">🗣️ <strong>Klaus Iglberger</strong>: There is no Silver Bullet</h3>

<p><a href="https://www.youtube.com/watch?v=5F3d3LocM3k">🎥 Video</a>.</p>

<p>Klaus Iglberger delivered an insightful talk that explored the challenges and trade-offs in software design,<br />
focusing on object-oriented programming (OOP) inheritance and its modern alternatives (<code class="language-plaintext highlighter-rouge">std::variant</code>, type-erasure, etc.) to implement homgeneous abstractions.
Highly entertaining and dynamic talk with a great sense humor, a noticeable hint of irony, and some references to Lord of the Rings !
And like always, he used the classic shape design example, to illustrate how working with massive, legacy codebases can be challenging.</p>

<blockquote>
  <p>[A.N] Personnal fun-facts:</p>

  <ul>
    <li>This talk has the same name as the very first software-design lecture I attended to, when studying in Seoul (South Korea), years ago.</li>
    <li>I wrote a few <em>(sometime, clumsy ?)</em> articles myself on related topics:
      <ul>
        <li><a href="https://gist.github.com/GuillaumeDua/b0f5e3a40ce49468607dd62f7b7809b1">(2021) Concept-based polymorphism in modern C++</a></li>
        <li><a href="https://gist.github.com/GuillaumeDua/0239fda353264b67ddcb39b5d9a01105">(2018) C++ polymorphism without vtables</a></li>
      </ul>
    </li>
  </ul>
</blockquote>

<h4 id="traditional-oopvtable-approach">Traditional <strong>OOP</strong>/<code class="language-plaintext highlighter-rouge">vtable</code> approach</h4>

<ul>
  <li><strong>Classic design patterns</strong>: Klaus started with a classic OOP solution, leveraging <code class="language-plaintext highlighter-rouge">virtual</code> functions and design patterns like <code class="language-plaintext highlighter-rouge">strategy</code>.
Example: A <code class="language-plaintext highlighter-rouge">Shape</code> interface with derived classes (<code class="language-plaintext highlighter-rouge">Circle</code>, <code class="language-plaintext highlighter-rouge">Square</code>) delegating drawing responsibilities to an injected <code class="language-plaintext highlighter-rouge">draw</code> strategy design pattern.</li>
  <li><strong>Architectural principle</strong>: This separation maintained a clean boundary between
    <ul>
      <li><strong>high-level</strong> (stable, low dependencies) <code class="language-plaintext highlighter-rouge">shape</code> logic and</li>
      <li><strong>low-level</strong> (volatile/maleable, high dependencies) <code class="language-plaintext highlighter-rouge">drawing</code> implementation <em>(e.g., OpenGL)</em>.</li>
      <li>emphasizing the separation of concerns (SoC) principle.</li>
    </ul>
  </li>
</ul>

<p>Critique of classic <code class="language-plaintext highlighter-rouge">OOP</code></p>

<ul>
  <li>Klaus highlighted its dated nature: it mirrors 1996 <a href="https://www.google.fr/books/edition/Design_Patterns/jUvf7wMUGcUC?hl=en">GoF (Gang of Four) style</a> practices and doesn’t align with truly modern, progressive C++.</li>
  <li>Referenced prominent criticisms of <code class="language-plaintext highlighter-rouge">OOP</code>, such as:
    <ul>
      <li><a href="https://www.youtube.com/watch?v=bIhUE5uUFOA">Sean Parents - Inheritance is the base class of evil</a><br />
<em>([A.N]: the original upload on <a href="http://channel9.msdn.com/Events/GoingNative/2013/Inheritance-Is-The-Base-Class-of-Evil">channel9.msdn.com</a> does not work anymore)</em></li>
      <li><a href="https://www.youtube.com/watch?v=pH-q2m5sb04">Phil Nash - OO considered harmful</a></li>
      <li>Jon Kalb
        <ul>
          <li><a href="https://www.youtube.com/watch?v=x1xkb7Cfo6w">Why don’t the cool kids like OOP ?</a></li>
          <li><a href="https://youtu.be/32tDTD9UJCE?t=61">Back to Basics: Object-Oriented Programming</a></li>
        </ul>
      </li>
      <li><a href="https://www.youtube.com/watch?v=gTNJXVmuRRA">Jonathan gopel: using modern C++ to eliminate virtual functions</a></li>
    </ul>
  </li>
  <li>Even if as experts we care about our level of C++, we’re living in a bubble: such an approach remains used in a roughly estimated 90% of existing C++ codebases.</li>
</ul>

<h4 id="is-stdvariant-a-modern-alternative-">Is <code class="language-plaintext highlighter-rouge">std::variant</code> (a modern) alternative ?</h4>

<p>Benefits:</p>

<ul>
  <li>Less and simplier code to write.</li>
  <li>Avoids inheritance, pointers, and dynamic allocation - thus, increases performances.</li>
  <li>Automatic, elegant lifetimes.</li>
  <li>Potentially improves performance.</li>
  <li>Functional programming style</li>
</ul>

<p>Challenges:</p>

<ul>
  <li>Architecturally speaking, using <code class="language-plaintext highlighter-rouge">std::variant</code> for runtime polymorphism is a total disaster/failure,<br />
as it violates the open-close <em>(OC, the “O” of <code class="language-plaintext highlighter-rouge">SOLID</code>)</em> principle.</li>
  <li>He emphasized that std::variant isn’t a silver bullet. It excels in scenarios with a fixed set of types and open operations but struggles with extensibility.</li>
</ul>

<h4 id="templates-to-the-rescue-">Templates to the rescue ?</h4>

<ul>
  <li>Adding template-type-parameters (TTP) to function helps removing some tight-couplings from the library to the userland code</li>
  <li>But it is slow to compile, as the compiler needs to instanciate each template function instance.</li>
</ul>

<h4 id="what-about-type-erasure-">What about type-erasure ?</h4>

<p>Achieving value-based OOP using type-erasure <em>([A.N]: which I call “opaque type: inheritance as an implementation detail”)</em> might be a middle-ground here.</p>

<ul>
  <li>Changes/extensions works as expected</li>
  <li>The architectural boundaries are adhered to</li>
  <li>Fewer pointers, fewer virtual functions (only one indirection)</li>
  <li>Less inheritance, less manual memory management</li>
  <li>Better performance<br />
Small Buffer/Base Optimization (<code class="language-plaintext highlighter-rouge">SBO</code>) using <code class="language-plaintext highlighter-rouge">std::aligned_storage</code> avoids dynamic allocation (which works fine for small objects).</li>
</ul>

<h4 id="conclusion-2">Conclusion</h4>

<ul>
  <li><strong>There is no universal, unique solution</strong> that one can use everytime, everywhere.
There is always a trade-off, and one technic might suite a specific situation better than the other.
    <ul>
      <li><code class="language-plaintext highlighter-rouge">std::variant</code> is not a replacement to virtual function: both are dynamic polymorphism technics, but differs.</li>
      <li>
        <p>OOP and <code class="language-plaintext highlighter-rouge">std::variant</code> are the two side of the same coin.</p>

        <table>
          <thead>
            <tr>
              <th>/</th>
              <th><code class="language-plaintext highlighter-rouge">std::variant</code></th>
              <th><strong>OOP</strong></th>
              <th>type-erasure</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>programming style</td>
              <td>functional</td>
              <td>object-oriented</td>
              <td>object-oriented</td>
            </tr>
            <tr>
              <td>set of types</td>
              <td>fixed</td>
              <td>open</td>
              <td>open</td>
            </tr>
            <tr>
              <td>sets of operations</td>
              <td>open</td>
              <td>closed</td>
              <td>closed</td>
            </tr>
            <tr>
              <td>recommanded architecture level</td>
              <td>low</td>
              <td>?</td>
              <td>higher</td>
            </tr>
          </tbody>
        </table>
      </li>
    </ul>
  </li>
  <li><strong>Architectural design matters</strong>
    <ul>
      <li>Features and language details are secondary to the overall design.</li>
      <li>Successful projects rely on well-thought-out architecture, not individual features.</li>
    </ul>
  </li>
  <li><strong>Document your decisions</strong>
    <ul>
      <li>Create an <strong>Architectural Decision Record</strong> (ADR) to document your decision-making process <em>(e.g, pros &amp; cons, trade-offs, final call, etc.)</em>.</li>
      <li>Consider each approach pros &amp; cons. Effective design requires balancing these based on current needs,<br />
thinking first about the architectural properties of the solution: what do you want to achieve ?</li>
    </ul>
  </li>
</ul>

<p>Klaus advocated moving away from the term “modern C++” to “progressive C++,” reflecting its constant evolution.</p>

<p>He then closed with a reminder: <em>“There is no silver bullet”</em>:</p>

<ul>
  <li>The fun - <em>and difficulty</em> - of software design lies in finding the right trade-offs for each unique situation.</li>
  <li>The talk emphasized the importance of a <strong>pragmatic architectural thinking</strong> over dogmatically chasing the latest language features, leaving the audience with valuable perspectives on crafting robust, maintainable C++ code.</li>
</ul>

<h2 id="-11152024">📅 11/15/2024</h2>

<h3 id="️-jens-weller-good-morning-meeting-c">🗣️ Jens Weller: Good Morning Meeting C++</h3>

<p>Jens started the second day of Meeting C++ 2024 with a warm welcome and shared updates and reflections on organizing the conference:</p>

<ul>
  <li><strong>Respect for speakers</strong>: he emphasized that every speaker deserves an engaged audience, reminding attendees of the effort behind each talk.</li>
  <li><strong>Conference recordings</strong>: All sessions will be available for viewing after the conference (first on Hubilo for attendees only, then on the <a href="https://www.youtube.com/@MeetingCPP/videos">MeetingCpp Youtube channel</a>).
    <ul>
      <li><em>[A.N] I’ll update this trip report when there are available.</em></li>
    </ul>
  </li>
  <li><strong>Behind-the-Scenes</strong>: Jens touched on the complexities of organizing a large event, particularly handling last-minute changes such as speakers unable to attend.</li>
</ul>

<h4 id="a-journey-to-produce-meeting-c-tshirts">A journey to produce Meeting C++ tshirts</h4>

<p>Jens humorously described the challenges (understand, pain) of designing conference T-shirts with C++ code printed on them:</p>

<ul>
  <li>Design hurdles:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">PNG</code> vs. <code class="language-plaintext highlighter-rouge">SVG</code> for graphics.</li>
      <li>Issues with colors and floating-point precision during the process.</li>
    </ul>
  </li>
  <li>Tools explored:
    <ul>
      <li>Learned to use build tools like <a href="https://docs.conan.io/2/">Conan 2.0</a> and <a href="https://github.com/cpp-best-practices/cmake_template">Jason Turner’s CMake starter template</a> <em>(presentation available <a href="https://www.youtube.com/watch?v=ucl0cw9X3e8&amp;ab_channel=C%2B%2BWeeklyWithJasonTurner">here on Youtube</a>)</em> with <a href="https://github.com/cpm-cmake/CPM.cmake">CPM</a>.</li>
    </ul>
  </li>
</ul>

<h3 id="️-hana-dusíková-center-keynote---my-favorite-data-structures">🗣️ Hana Dusíková: Center Keynote - my favorite data structures</h3>

<p><a href="https://www.youtube.com/watch?v=jAIFLEK3jiw">🎥 Video</a>.</p>

<p>Hana Dusíková delivered a delightful - <em>yet, sometimes mind-bending</em> - keynote, exploring the intricacies of <code class="language-plaintext highlighter-rouge">constexpr</code> programming and containers,<br />
highlighting her <em>favorite data structure</em> - but also experience hacking the <strong>Clang</strong> compiler to address some personal frustrations and deeper her understanding of how things work under the hood.</p>

<h4 id="about-the-speaker">About the speaker</h4>

<p>Hana works at <strong>Woven by Toyota</strong> - <em>one of the conference sponsor</em> - and is the chair of the reflection and compile-time study group.<br />
Her last talks are about her projects: <a href="https://github.com/hanickadot/compile-time-regular-expressions">CTRE</a>, <a href="https://github.com/hanickadot/co_curl">co_curl</a>, <a href="https://github.com/hanickadot/cthash">cthash</a> (sha-2, sha-3).</p>

<blockquote>
  <p>[A.N] I loved so much her talk about <a href="https://www.youtube.com/watch?v=i7H5TSVJy0Y">CTRE at the CPPP-2019</a>, I strongly encourage you to watch it if you haven’t already.</p>
</blockquote>

<h4 id="exploring-symbolic-execution-in-c">Exploring symbolic execution in C++</h4>

<ul>
  <li><strong>LLVM Clang</strong>’s <code class="language-plaintext highlighter-rouge">ExprConstant.cpp</code>: The core of symbolic execution in C++, essentially a CPU arch independent interpreter written in one file.</li>
  <li><code class="language-plaintext highlighter-rouge">APValue</code>: Represents C++ values during constant evaluation,
    <ul>
      <li>encompassing various “stuffs”
        <ul>
          <li>can be nothing</li>
          <li>types (int, float, array, unions, struct, pointers).</li>
          <li>lvalues (references or pointers)</li>
        </ul>
      </li>
      <li>Detailed description on how arrays, unions, and pointers are represented and their constraints.</li>
      <li>Highlighted how pointer provenance and undefined behavior arise from the lack of symbol ordering in pointers,<br />
as well as how rvalue are marked as temporary as such a value is about to be destroyed soon, thus one can steal from it, and expressing lifetime concerns in general.</li>
    </ul>
  </li>
  <li><strong>Enhanced safety</strong>: the interpreter helps detect violations of the C++ abstract machine, making <strong>constexpr code safe and deterministic</strong>.</li>
</ul>

<h4 id="constexpr-containers-in-the-standard-library"><code class="language-plaintext highlighter-rouge">constexpr</code> containers in the standard library</h4>

<p>Hana analyzed which STL containers are currently constexpr and why:</p>

<ul>
  <li>Supported: <code class="language-plaintext highlighter-rouge">vector</code>, <code class="language-plaintext highlighter-rouge">array</code>, <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">optional</code>.</li>
  <li>Not supported (yet): <code class="language-plaintext highlighter-rouge">deque</code>, <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">set</code>, <code class="language-plaintext highlighter-rouge">unordered_map</code>, <code class="language-plaintext highlighter-rouge">unordered_set</code>, <code class="language-plaintext highlighter-rouge">list</code>, <code class="language-plaintext highlighter-rouge">flat_set</code>, <code class="language-plaintext highlighter-rouge">flat_map</code> <em>(even if it’s a new feature)</em>.</li>
</ul>

<p>Challenges like exception safety, memory allocation, and reallocation explain these limitations.<br />
Hana calls for more <code class="language-plaintext highlighter-rouge">constexpr</code>-compatible containers to leverage C++’s evolving capabilities.</p>

<h4 id="about-constexpr-limitations">About <code class="language-plaintext highlighter-rouge">constexpr</code> limitations</h4>

<p>The speaker then outlined the historical progress of <code class="language-plaintext highlighter-rouge">constexpr</code> features/milestones, and their limitations:</p>

<ul>
  <li>C++14 introduced control flow and variables.</li>
  <li>C++17 added lambda calling.</li>
  <li>C++20 brought <code class="language-plaintext highlighter-rouge">try</code>/<code class="language-plaintext highlighter-rouge">catch</code>, trivial initialization, changing active member of a union, and virtual functions.</li>
</ul>

<p>And what are our future needs, which are mostly covered by the following proposals - <em>that she mostly authored</em>:</p>

<ul>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r4.html">P3068</a>: allowing exceptions throwing in constant-evaluation <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3378r0.html">P3378</a>: constexpr exception types <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r0.html">P3309</a>: constexpr atimic and atomic_ref <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3037r3.pdf">P3037</a>: constexpr <code class="language-plaintext highlighter-rouge">std::shared_ptr</code> <em>(Paul Keir)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3125r1.html">P3125</a>: constexpr pointer tagging <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3074r4.html">P3074</a>: trivial unions <em>(Barry Revzin)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3372r2.html">P3372</a>: constexpr containers and adapters <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3295r2.html">P3295</a>: freestanding constexpr containers and constexpr exception types <em>(Ben Craig)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3367r0.html">P3367</a>: constexpr coroutines <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3391r0.html">P3391</a>: constexpr <code class="language-plaintext highlighter-rouge">std::format</code> <em>(Barry Revzin)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3449r0.html">P3449</a>: constexpr <code class="language-plaintext highlighter-rouge">std::generator</code> <em>(Hana)</em></li>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1974r0.pdf">P1974</a>: non-transient constexpr allocation using propconst <em>(Jeff Snyder)</em></li>
</ul>

<h4 id="her-favorite-data-structure-hash-array-mapped-trie-hamt">Her favorite data-structure: <a href="https://en.wikipedia.org/wiki/Hash_array_mapped_trie">Hash array mapped trie (HAMT)</a></h4>

<blockquote>
  <p><em>A hash array mapped trie (HAMT) is an implementation of an associative array that combines the characteristics of a hash table and an array mapped trie.</em><br />
<em>It is a refined version of the more general notion of a hash tree.</em> - <a href="https://en.wikipedia.org/wiki/Hash_array_mapped_trie">wikipedia</a></p>
</blockquote>

<p>Usage scenario:</p>

<ul>
  <li>Ideal for snapshot systems due to its structure and efficiency.</li>
</ul>

<p>Advantages:</p>

<ul>
  <li>O(1) for insert, search, delete.</li>
  <li>Linear growth with no rehashing.</li>
  <li>Lock-free.</li>
  <li>Persistent, compatible with flat storage (using offsets instead of pointers).</li>
</ul>

<h4 id="closing-thoughts">Closing thoughts</h4>

<p>This keynote - <em>like her other ones</em> - showcased Hana’s deep expertise in <code class="language-plaintext highlighter-rouge">constexpr</code> programming and her passion for pushing the boundaries of C++.<br />
Her vision for the future of <code class="language-plaintext highlighter-rouge">constexpr</code> includes extending support for all containers, coroutines, and generally speaking bringing most of the C++ runtime world into the compile-time realm; effectively refining C++ as a language for both runtime and compile-time efficiency with no safety compromise.</p>

<blockquote>
  <p>[A.N] My <strong>question</strong>: Do you use a specific/dedicated test framework to create unit test for constant-evaluated code, or do you only use some static_asserts ?</p>

  <p>Answer:</p>

  <ul>
    <li>test suite of LLVM code for such a code</li>
    <li><code class="language-plaintext highlighter-rouge">static_assert</code></li>
    <li><a href="https://github.com/catchorg/Catch2">Catch2</a></li>
    <li>Issue: measuring code coverage in <code class="language-plaintext highlighter-rouge">constexpr</code> code is a hassle</li>
  </ul>
</blockquote>

<h3 id="️-olivia-quinet-applied-modern-c--beyond-type-erasure-and-visitor-design-patterns">🗣️ Olivia Quinet: Applied modern c++ : beyond type-erasure and visitor design patterns</h3>

<p><a href="https://meetingcpp.com/mcpp/slides/2024/OliviaQuinet_Applied_Modern_C++_Beyond_TypeErasure_And_Visitor_Design_Patterns426537.pdf">📄 Slidedeck</a>.</p>

<p>Olivia Quinet’s talk tackled heavily used C++ polymorphism design techniques,<br />
with a focus on <strong>type-erasure</strong> and the <strong>visitor</strong> design pattern, questionning such designs <strong>scalability</strong> and <strong>limitations</strong>.<br />
Despite being visibly nervous, she successfully presented her design, which echoed with Klaus Iglberger’s talk from the previous day <em>“There is no Silver Bullet”</em>.</p>

<h4 id="key-ideas">Key ideas</h4>

<p>What is a software ?</p>

<ul>
  <li>Software processes inputs to produce outputs, relying on models for transformations and error handling.</li>
  <li>Building software is analogous to building a factory, with frequent updates and increasing complexity management.</li>
</ul>

<p>Challenges for <strong>flexible</strong> architectures: modern software grows in <strong>complexity</strong> due to:</p>

<ul>
  <li>Increasing number of object types.</li>
  <li>Expanding processing pipelines.</li>
  <li>Greater number of transformations and actions.</li>
</ul>

<p><strong>Orthogonality</strong> in C++: as the source code is compiled, the amount of types and operations are finite.</p>

<ul>
  <li>More types -&gt; Shall use <strong>type-erasure</strong> for flexibility.</li>
  <li>More operations -&gt; Shall use the <strong>visitor</strong> pattern.</li>
</ul>

<h4 id="revisiting-design-patterns">Revisiting design patterns</h4>

<p>Visitor pattern with <code class="language-plaintext highlighter-rouge">std::variant</code> + <code class="language-plaintext highlighter-rouge">std::visit</code></p>

<ul>
  <li>
    <p>Visitors allow operations on the current alternative <em>(of a compile-time set of types)</em> value being held by a given <code class="language-plaintext highlighter-rouge">std::variant&lt;Ts...&gt;</code></p>
  </li>
  <li>Type-deduced visitor: lambda with <code class="language-plaintext highlighter-rouge">auto arg</code>.</li>
  <li>Type-matching visitor: <code class="language-plaintext highlighter-rouge">if constexpr</code>.</li>
  <li>Overloaded visitor: using function overloads for type matching.</li>
</ul>

<p>Pros and cons of the <code class="language-plaintext highlighter-rouge">visitor pattern</code>:</p>

<ul>
  <li>Pros: Easy to add new operations to a pipeline.</li>
  <li>Cons: Adding a new type requires updating the variant and all related visitors.</li>
</ul>

<p>Type-erasure pattern:</p>

<ul>
  <li>Provides a value-semantic interface to work with unrelated types (an open set of types).</li>
  <li>Using technics such as Pimpl, concepts, and models.</li>
  <li>Ideal for adding new types without modifying the existing pipeline.</li>
</ul>

<h4 id="combining-type-erasure-and-visitor-patterns-olivias-hybrid-approach">Combining type-erasure and visitor patterns: Olivia’s hybrid approach</h4>

<p>Prerequisites:</p>

<ul>
  <li>Pipeline-based processing.</li>
  <li>Known types at compile time for a given pipeline version.</li>
  <li>No dynamic library loading.</li>
</ul>

<p>Requirements:</p>

<ul>
  <li>Non-intrusive implementation.</li>
  <li>Value semantics.</li>
  <li>Type-erasure for type extensibility, with a common interface</li>
  <li>Visitor pattern for adding functionalities.</li>
</ul>

<p>A complete demonstration is available <a href="https://github.com/olivia76/cpp-te">here on github.com/olivia76/cpp-te</a>.
This approach allows for flexibility in both adding types and operations, while retaining most of the advantages of both patterns.</p>

<h4 id="lessons-learned">Lessons learned</h4>

<p>After performing a live demo and presenting some benchmarks <em>(comparing several ways to implement type-erasure, using either function ptrs, std::function, and/or vtables)</em>, Olivia shared her insights:</p>

<ul>
  <li>Promote iterative process: <em>“Think, try, test, repeat.”</em></li>
  <li>Stay updated with evolving C++ standards and features.</li>
  <li>There is no universal solution (silver bullet), as trade-offs are inevitable.</li>
</ul>

<h3 id="️-kate-gregory-the-aging-programmer">🗣️ Kate Gregory: The Aging Programmer</h3>

<p><a href="https://meetingcpp.com/mcpp/slides/2024/The%20Aging%20Programmer714822.pdf">📄 Slidedeck</a></p>

<p>Kate Gregory delivered an insightful and deeply personal talk on the challenges and opportunities of aging as a programmer.<br />
With practical advice grounded in her own experiences, research, and surveys, she encouraged attendees to think long-term about their careers, health, and happiness.</p>

<blockquote>
  <p>[A.N] Having been profoundly influenced by Kate Gregory’s previous talks - <em>each questioning &amp; reshaping how I approach my work, and my relationship with code and design in general</em> -,<br />
I was particularly eager to attend this one. It didn’t disappoint: I <strong>loved</strong> it.</p>

  <p>The talk resonated deeply, aligning with personal reflections and offering invaluable insights for tackling the uncertainty - <em>thus, anxiety</em> - of aging <em>(after all, no one gets to grow old twice)</em>.<br />
As always, I was struck by her caring, positive, and hopeful ton and outlook.<br />
Her words didn’t just stay with me; I found myself immediately sharing my notes with friends &amp; family, eager to spread the wisdom she offered.</p>
</blockquote>

<p>In a nutshell: Embracing the aging process</p>

<ul>
  <li>Aging is inevitable: if you’re not aging, then you’re already dead.</li>
  <li>Not everyone gets to be an “old programmer” due to life changes, health, or retirement.</li>
  <li>The goal is to enjoy programming into your later years, which requires <strong>planning</strong> and <strong>efforts</strong>.</li>
</ul>

<h4 id="about-health-body-and-mind">About health: <strong>body</strong> and <strong>mind</strong></h4>

<p>Physical health challenges and tips to age better</p>

<ul>
  <li><strong>Eyesight</strong>: Regular checkups are essential.<br />
Tools like glasses for different tasks can boost productivity and reduce strain.</li>
  <li><strong>Exercise</strong>: Strength, stamina, and flexibility exercises improve overall health, reduce pain, and enhance cognition.</li>
  <li><strong>Hearing</strong>: Protect your hearing now; damage is irreversible.<br />
Hearing loss can isolate you socially and professionally.</li>
  <li><strong>Wrists and joints</strong>: Ergonomic setups and exercises can mitigate strain.<br />
Night braces or posture adjustments may help.</li>
  <li><strong>Injuries and illness</strong>: Preventative care, vaccines, and addressing issues promptly are vital to aging well.</li>
</ul>

<p>Mental and emotional health</p>

<ul>
  <li><strong>Short-term memory</strong>: Use habits, routines, checklists, and tools to stay organized and focused.<br />
Avoid multitasking.</li>
  <li><strong>Learning new skills</strong>: With experience, you’ve already mastered learning-embrace change and connect new concepts to what you know.</li>
  <li><strong>Mood and cynicism</strong>: Aging doesn’t have to mean grumpiness.<br />
[A.N] After the talk, someone in the audience advised <em>“Don’t let the old in”</em>: One does not have to play that <strong>role</strong>, it’s not a fatality.<br />
Staying positive requires planning, preparation, and flexibility.</li>
</ul>

<h4 id="addressing-challenges-in-the-workplace">Addressing challenges in the Workplace</h4>

<ul>
  <li><strong>Age discrimination</strong>: Common in tech, especially for women.<br />
Combat biases, but recognize some environments may not fit.</li>
  <li><strong>Physical limitations</strong>: Workplace setups often create unnecessary barriers <em>(e.g., stairs, lighting)</em>.<br />
Evaluate whether the issue lies with your body or the environment.</li>
  <li><strong>Adapting work</strong>: Adjusting expectations or shifting roles can keep you engaged.</li>
  <li><strong>Retirement or industry changes</strong>: Choosing to retire or switch fields is valid and not inherently negative.</li>
</ul>

<h4 id="building-a-long-happy-career-and-life">Building a long, happy career <strong>and</strong> life</h4>

<p>Practical steps for longevity</p>

<ul>
  <li><strong>Exercise</strong>: Supports body, brain, and emotional well-being.</li>
  <li><strong>Health maintenance</strong>: Regular checkups, a balanced diet, and avoiding harmful habits <em>(e.g., drinking, smoking)</em> are critical.</li>
  <li><strong>Finances</strong>: Save and invest for long-term stability.</li>
</ul>

<p>Social connections</p>

<ul>
  <li>Losses are inevitables, but building new friendships through hobbies, work, and community can sustain you emotionally.</li>
  <li>Younger friends keep your perspective fresh as you age.</li>
</ul>

<p>Finding purpose</p>

<ul>
  <li>Hobbies, mentorship, or other activities can provide meaning beyond professional work.</li>
</ul>

<h4 id="the-upsides-of-aging">The upsides of aging</h4>

<ul>
  <li><strong>Freedom</strong>: Aging reduces fear and dependence on others’ opinions.</li>
  <li><strong>Perspective</strong>: Experience brings confidence and the ability to give up things that no longer serve you.</li>
  <li><strong>Resources</strong>: Time and money often increase with age, enabling new adventures and priorities.</li>
</ul>

<h4 id="kates-core-advices">Kate’s core advices</h4>

<ul>
  <li><strong>Take care of yourself</strong>: Health, exercise, and nutrition are investments in your future.</li>
  <li><strong>Build relationships</strong>: Maintain and create friendships throughout your life.</li>
  <li><strong>Stay curious</strong>: Try new things, embrace changes, and <strong>find purpose</strong>.</li>
</ul>

<p>Aging is not a barrier to a fulfilling life or career: it’s an opportunity to grow, adapt, and thrive.<br />
As Kate emphasized: <em>“It’s never too soon, and it’s never too late.”</em>.</p>

<h3 id="️-peter-muldoon-software-engineering-completeness--knowing-when-you-are-done-and-why-it-matters-">🗣️ Peter Muldoon: Software Engineering Completeness : Knowing when you are Done and Why it matters ?</h3>

<p><a href="https://www.youtube.com/watch?v=pE8k3RXdp8s">🎥 Video</a>.</p>

<blockquote>
  <p><em>“Achieving sustainability should be the main goal of every engineer,<br />
as it means reaching a level of mastery where you can confidently guide decisions and advise your boss - though many may feel unprepared for such a responsibility.”</em><br />
<em>“Are we done yet ? Probably not ! Why ?”</em></p>
</blockquote>

<p>Context: Inspirations &amp; motivations behind this talk</p>

<ul>
  <li>Stemmed from discussions about the cost of software ownership</li>
  <li>Software engineering is not just about writing code but <strong>maintaining it over time</strong>.</li>
  <li>Many struggle with <strong>defining when something is done</strong> (DoD) or setting realistic completion dates.</li>
</ul>

<h4 id="about-the-definition-of-done-dod">About the definition of <strong>done</strong> (DoD)</h4>

<p>What does “<em>Done</em>” mean ? Peter opposed two definitions:</p>

<ul>
  <li>From the dictionary definition: Work until task fulfillment.</li>
  <li>From an engineering perspective: Formal declaration that a product meets defined quality standards.</li>
</ul>

<p>Why shall we define and share a <strong>DoD</strong> ?</p>

<ul>
  <li>Establishes a <strong>shared understanding</strong> and unified language for delivering software.</li>
  <li>Ensures new employees have access to essential knowledge and expectations.</li>
  <li>Encourages acknowledgment of shared responsibilities across teams.</li>
</ul>

<h4 id="software-value-customer-vs-engineering-perspectives">Software value: customer vs. engineering perspectives</h4>

<p><strong>Customer</strong>-focused software value actualized value when software is:</p>

<ul>
  <li><strong>Available</strong>: Accessible to users.</li>
  <li><strong>Usable</strong>: Practical and user-friendly.</li>
  <li><strong>Reliable</strong>: Stable and dependable.</li>
</ul>

<p><strong>Engineering</strong>-focused software value includes future-looking value:</p>

<ul>
  <li><strong>Configurable</strong>: Easy to adjust.</li>
  <li><strong>Flexible</strong>: Handles changes gracefully.</li>
  <li><strong>Maintainable</strong>: Quick issue resolution.</li>
  <li><strong>Evolvable</strong>: Can adapt to market and requirements changes.</li>
</ul>

<h4 id="delivering-changes-to-production">Delivering changes to production</h4>

<p>Types of improvements:</p>

<ul>
  <li>New features.</li>
  <li>Bug fixes.</li>
  <li>Feature flag updates.</li>
  <li>Configuration changes.</li>
  <li>Technical debt mitigation/reduction (e.g., refactoring, deprecations, etc.).</li>
  <li>Infrastructure/environment upgrades (e.g., compiler updates, architecture support, etc.).</li>
</ul>

<p>Risks introduced:</p>

<ul>
  <li>Broken or missing functionality.</li>
  <li>Performance and security issues.</li>
  <li>System unreliability.</li>
</ul>

<h4 id="about-acceptance-criterias-ac">About acceptance criterias (AC)</h4>

<blockquote>
  <p>What are acceptance criteria ? Conditions a product must meet to be accepted by the user.</p>
</blockquote>

<p>Characteristics of good ACs:</p>

<ul>
  <li><strong>Clarity</strong>: Easy to understand.</li>
  <li><strong>Conciseness</strong>: No unnecessary details.</li>
  <li><strong>Testability</strong>: Results visible to the customer.</li>
  <li><strong>Observability</strong>: Outcomes measurable.</li>
</ul>

<p>How to write ACs:</p>

<ul>
  <li><strong>Author</strong>: Product owner or team member.</li>
  <li><strong>Process</strong>: Shared with the team and validated by customer/proxy.</li>
  <li>Can follow the <strong>Gherkin</strong> style: given (context), when (action), then (result).</li>
</ul>

<h4 id="problem-domains--complexity">Problem domains &amp; complexity</h4>

<p>Complexity levels influence predictability and risk, thus forecasting:</p>

<ul>
  <li><strong>Unknown</strong>: Minimal information, low confidence.</li>
  <li><strong>Simple</strong>: Well-understood, low risk.</li>
  <li><strong>Complicated</strong>: Multiple moving parts, requires analysis.</li>
  <li><strong>Complex</strong>: Many unknowns, dependencies, and risks.</li>
</ul>

<p><a href="https://en.wikipedia.org/wiki/Cynefin_framework">The Cynefin framework</a> is helpful in categorizing problems domains.</p>

<h4 id="time-scope-and-estimates">Time, scope, and estimates</h4>

<p>Why engineers struggle with time estimates:</p>

<ul>
  <li>Misplaced optimism.</li>
  <li>Lack of consideration for start dates alongside deadlines.</li>
</ul>

<p>How to produce better estimates ?</p>

<ul>
  <li>Break tasks into smaller pieces.</li>
  <li>Clearly define requirements and scope.</li>
  <li>Acknowledge uncertainty and plan for delays.</li>
  <li>Communicate updated timelines as new information arises.</li>
</ul>

<h4 id="are-we-done-yet--the-software-engineering-completeness-pyramid">Are we done yet ? The software-engineering completeness pyramid</h4>

<blockquote>
  <p>The software-engineering completeness pyramid is like the <a href="https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs">Maslow pyramid of needs</a>, for software development.</p>
</blockquote>

<p>Development done ?</p>

<ul>
  <li>Changes verified and meet all ACs.</li>
  <li>All tests passed <em>(unit, non-regression, integration, etc.)</em>.</li>
  <li>Code reviewed, committed, and ready for release.</li>
</ul>

<p>Deployment done ?</p>

<ul>
  <li>Code deployed everywhere <em>(not just one site, etc.</em>).</li>
  <li>Dependencies tracked and resolved.</li>
</ul>

<p>Feature flags done ?</p>

<ul>
  <li>Fully enabled and utilized in production.</li>
  <li>Removed once changes are stable.</li>
</ul>

<h4 id="code-health-refactoring-decommissioning-and-technical-debt">Code health: refactoring, decommissioning, and technical debt</h4>

<p>Technical debt:</p>

<ul>
  <li>Accumulated shortcuts in the codebase.</li>
  <li>Can be <strong>intentional</strong>: strategic trade-offs with planned mitigation.
    <ul>
      <li>[A.N] So-called quick-wins requires mitigation planning</li>
    </ul>
  </li>
  <li>Can be <strong>unintentional</strong>: non-strategic, no plan to resolve.</li>
</ul>

<p>Refactoring:</p>

<ul>
  <li>Improves internal structure without altering behavior.</li>
  <li><strong>Challenges</strong>: Time constraints, poor reviews, and lack of planning/forecasting.</li>
  <li>Not refactoring leads to system rewrites over time.</li>
</ul>

<p>Decommissioning:</p>

<ul>
  <li>Process of retiring outdated code.</li>
  <li>Identifies unused or redundant functionality.</li>
</ul>

<p>How to <strong>prevent</strong> new technical debt introduction ?</p>

<ul>
  <li>Proper <strong>timelines</strong>, code &amp; design <strong>reviews</strong> (with appropriate guidelines), coding <strong>standards</strong>, and documentation.</li>
  <li>Track <em>(but try not to add too much items to the backlog)</em> and address debt <strong>regularly</strong> <em>(e.g quarterly sprints, etc.)</em>.</li>
  <li><strong>Trainings</strong>, best-practices, and knowledge sharing.</li>
</ul>

<h4 id="testing-and-sustainability">Testing and sustainability</h4>

<p>Is the testing done ?</p>

<ul>
  <li><strong>Coverage</strong> across all levels: unit, integration, system, non-regression, etc.</li>
  <li>Lessons from past failures applied as new tests.</li>
  <li>Use <strong>test automation</strong>, triggering alerts (slack, emails, etc.) in case of failure.</li>
</ul>

<p>Sustainability goals:</p>

<ul>
  <li>Decreasing technical debt.</li>
  <li>Structurally maintainable codebase.</li>
  <li>Satisfied developers, clients, and stakeholders.</li>
</ul>

<h4 id="conclusion-3">Conclusion</h4>

<p>Codebase health/substainability differs from new feature implementations and bug-fixes.</p>

<p>When are you done ?</p>

<ul>
  <li>The feature or bug fix meets all acceptance criterias
    <ul>
      <li>Possibly injects intentional tech-debt to meet the deadline - which must be addressed <strong>immediately</strong> after.</li>
    </ul>
  </li>
  <li>It is <strong>deployed</strong> everywhere in production.</li>
  <li>Code is <strong>maintainable</strong> and team-supported.</li>
  <li>The tech-debt is decreasing - <em>not increasing</em></li>
  <li>Users and the business are <strong>happy</strong>.</li>
</ul>

<h3 id="️-nico-heidtke-growing-pains---lessons-from-seeing-codebases-mature">🗣️ Nico Heidtke: Growing Pains - Lessons from Seeing Codebases Mature</h3>

<p><a href="https://docs.google.com/presentation/d/1a01QDBjjLndO11i3J83w6-OwUgnJJ-mS8TOQFzBQ1sk/edit?usp=drive_link">📄Slidedeck</a>.</p>

<blockquote>
  <p>“Give me six hours to chop down a tree, and I will spend the first four sharpening the axe” - <em>Abraham Lincoln</em>.</p>
</blockquote>

<p>Nico Heidtke shared insights into the challenges of growing and maintaining C++ codebases, focusing on lessons learned from real-world experiences.<br />
He emphasized the need to balance technical excellence with team alignment, knowledge transfer, and sustainable practices in general.</p>

<h4 id="team-related-challenges">Team-related challenges</h4>

<p>As teams expand, new hurdles arise: efficiently onboarding new contributors, mitigating knowledge loss when members depart, and ensuring sustained team alignment requires well-defined processes.</p>

<h4 id="codebase-layout--conventions">Codebase layout &amp; conventions</h4>

<p>Early decisions on structure and standards can have long-lasting impacts.<br />
Clear organization and consistent conventions improve - <em>or help maintain</em> - productivity and onboarding but require ongoing attention.</p>

<h4 id="knowledge-transfer--documentation">Knowledge transfer &amp; documentation</h4>

<p>Reliance on verbal communication leads to information loss over time.<br />
Good documentation - <em>both code-specific and design/architectural</em> - is essential, and updates must be aligned with code changes.</p>

<h4 id="development-tools--automation">Development tools &amp; automation</h4>

<p>Tools like linters, formatters, and CI/CD pipelines help <strong>scale processes</strong> and <strong>maintain quality</strong>.<br />
Early integration of such tools avoids technical debt, and “warning flood/fatigue” must be managed immediatly.</p>

<h4 id="managing-dependencies--abstractions">Managing dependencies &amp; abstractions</h4>

<p>Portability matters, more than you might think. Favor <strong>standard library abstractions</strong> rather than plateform-specific code.<br />
When platform-specific logic is unavoidable, <strong>encapsulate</strong> it within dedicated libraries and ensure your CI/CD pipeline tests across all targeted platform and compiler combinations <em>(e.g using GH-action matrixes)</em>.
These practices help prevent significant future overhead, keeping third-party dependencies and platform-specific code maintainable in the long term.</p>

<h4 id="interoperability--localization">Interoperability &amp; localization</h4>

<p>Interfacing with other languages and systems is almost inevitable - <em>C remains the go-to for cross-language compatibility</em>.<br />
For globalization, adhering to standards like <code class="language-plaintext highlighter-rouge">UTF-8</code> - <em>for text</em> - and <code class="language-plaintext highlighter-rouge">UTC</code> - <em>for time</em> - minimizes future rework.</p>

<h4 id="conclusion-4">Conclusion</h4>

<p>Overall, the talk highlighted the importance of proactive planning, clear communication, and leveraging tools to navigate the growing pains of maturing codebases.</p>

<h3 id="️-herb-sutter-peering-forward---cs-next-decade">🗣️ Herb Sutter: Peering forward - C++’s next decade</h3>

<p><a href="https://www.youtube.com/watch?v=sbcOdb37n8o">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2024/Meeting%20C++%202024606565.pdf">slidedeck</a>.</p>

<blockquote>
  <p>Herb Sutter made a grand entrance, arriving just in time to kick off his keynote:<br />
“Does everybody have a beer ? Do I have until midnight ?”<br />
He set the stage for an exciting journey into the future of C++, comparing C++26/29 to a treasure chest slowly being filled with gems,<br />
each feature being a valuable addition to the language’s evolution.</p>
</blockquote>

<p>Herb Sutter presented an insightful and visionary outlook on C++’s evolution, focusing on three key pillars: <strong>reflection</strong>, <strong>safety</strong>, and <strong>simplicity</strong>.<br />
These advances, already shaping C++26 and beyond, aim to revolutionize the way we write and maintain code, while ensuring that C++ continues to meet evolving industry demands.</p>

<h4 id="reflection">Reflection</h4>

<p>Reflection is an important metaprogramming milestone, allowing programs to - <em>at compile-time</em> - inspect and modify their own structures, thus with zero <strong>runtime</strong> overhead <em>(to use such informations at runtime, one have to store them)</em>.<br />
By making the structure of types directly usable as inputs, it simplifies tasks like options parsing and code generation. Reflection and compile-time programming mark a natural progression in C++’s journey, offering transformative potential for future development patterns.</p>

<p>See the <a href="https://github.com/cplusplus/papers/issues/1764">P3096 proposal</a>,<br />
and this <a href="https://godbolt.org/z/rvdabTb5M">live example here on compiler-explorer</a>, which uses the <a href="https://en.wikipedia.org/wiki/Edison_Design_Group">EDG front-end</a>.</p>

<h4 id="safety">Safety</h4>

<blockquote>
  <p>See <a href="https://herbsutter.com/2024/03/11/safety-in-context/">“C++ safety, in context”</a>, <em>aka the <strong>“cold” war</strong>, in progress</em>,<br />
<em>also available on <a href="https://www.tinyurl.com/sutter-safety">tinyurl.com/sutter-safety</a></em>.</p>
</blockquote>

<p>New tools aim to address type, bounds, initialization, and lifetime safety-critical sources of vulnerabilities in C++.<br />
What is nowadays <em>“watch out”</em> features (performance &amp; control by default, safety always available),<br />
will become <em>“opt-out”</em> ones (safety by default, performance &amp; control always available).</p>

<p>Features like <strong>erroneous behavior</strong>, introduced in C++26, provide defined outcomes for mistakes,<br />
<strong>reducing risks</strong> like uninitialized values without compromising performance or control.</p>

<p><strong>Erroneous behaviors</strong> semantically differ from <strong>undefined behaviors</strong>: <em>“well-defined as being wrong”</em> vs. <em>“anything can happend”</em>.<br />
These changes improve the safety of existing codebases simply by recompiling, bridging a gap historically filled by manual effort or third-party tools.</p>

<h4 id="simplicity-through-generalization">Simplicity, through generalization</h4>

<p>C++ continues to simplify by enabling developers to <strong>directly express intent</strong> rather than relying on verbose annotations,<br />
effectively <em>focusing on the <strong>“what”</strong>, not <strong>“how”</strong></em>.</p>

<p>Features such as range-for loops or reflection align with such a philosophy, reducing complexity while maintaining power.<br />
Simplification is achieved not by subtraction but through carefully chosen additions (features) that abstract away common patterns and pitfalls.</p>

<h4 id="looking-ahead">Looking ahead</h4>

<p>The combination of increased compile-time capabilities and enhanced safety mechanisms promises to make C++ more approachable and robust.<br />
Challenges remain, particularly in ensuring these features are widely adoptable and scalable for existing codebases.<br />
Nonetheless, Herb envisions a future where developers write <strong>safer</strong>, <strong>simpler</strong>, and <strong>more expressive</strong> code, setting the stage for C++ to remain a cornerstone of systems programming for the decade ahead.</p>

<h2 id="-11162024">📅 11/16/2024</h2>

<h3 id="️-rainer-grimm-an-overview-on-the-c26-highlights">🗣️ Rainer Grimm: An overview on the C++26 highlights</h3>

<p><a href="https://meetingcpp.com/mcpp/slides/2024/Cpp26643772.pdf">📄 Slidedeck</a>.</p>

<p>C++26 introduces a wealth of features which - <em>from my perspective</em> - meet industry demands, emphazing <strong>simplicity</strong>, <strong>safety</strong>, and <strong>performances</strong>.<br />
These advancements are set to make the language more <strong>intuitive</strong> and <strong>robust</strong>, catering to both modern industry challenges and developer expectations. <em>In a nutshell: less code, more value</em>.</p>

<h4 id="reflection-1">Reflection</h4>

<ul>
  <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2996r5.html">P2996r5</a> as a MVP</li>
  <li>Introduces the reflection operator <code class="language-plaintext highlighter-rouge">^</code></li>
  <li>Splicer <code class="language-plaintext highlighter-rouge">[:…:]</code>, and metafunctions (in <code class="language-plaintext highlighter-rouge">std::meta</code> namespace), and <code class="language-plaintext highlighter-rouge">std::meta::info</code>.</li>
</ul>

<h4 id="contracts">Contracts</h4>

<ul>
  <li>Preconditions and postconditions - <code class="language-plaintext highlighter-rouge">post(condition)</code>/<code class="language-plaintext highlighter-rouge">pre(condition)</code> - as contextual function keywords.</li>
  <li>Assertions/invariants <code class="language-plaintext highlighter-rouge">contract_assert(condition)</code> as keyword.</li>
  <li>Live example available <a href="https://godbolt.org/z/Wd7q3eMGf">here on compiler-explorer</a>.</li>
</ul>

<h4 id="placeholders">Placeholders</h4>

<ul>
  <li>Highlights unused variables using <code class="language-plaintext highlighter-rouge">_</code></li>
  <li><code class="language-plaintext highlighter-rouge">auto [_, a, _] = func();</code></li>
</ul>

<h4 id="static-assertions">Static assertions</h4>

<ul>
  <li><code class="language-plaintext highlighter-rouge">static_assert</code> supports user-defined type properties</li>
  <li><code class="language-plaintext highlighter-rouge">static_assert(sizeof(S) == 1, std::format("unexpected size: {}", sizeof(S)));</code></li>
</ul>

<h4 id="templates-parameter-pack-indexing">Templates parameter pack indexing</h4>

<ul>
  <li>Provides direct access to elements of a pack</li>
  <li><code class="language-plaintext highlighter-rouge">T...[0]; values...[0];</code></li>
</ul>

<h4 id="deletereason"><code class="language-plaintext highlighter-rouge">delete(reason)</code></h4>

<ul>
  <li>clearer function restrictions</li>
</ul>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">double</span><span class="p">){}</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span> <span class="kt">void</span> <span class="n">func</span><span class="p">(</span><span class="n">T</span><span class="p">)</span> <span class="o">=</span> <span class="k">delete</span><span class="p">(</span><span class="s">"only for double"</span><span class="p">);</span>
</code></pre></div></div>

<h4 id="string-likes-improvements">String-likes improvements</h4>

<ul>
  <li>Compare <code class="language-plaintext highlighter-rouge">&lt;charconv&gt;</code> function results to bool <em>(<code class="language-plaintext highlighter-rouge">from_char</code>, <code class="language-plaintext highlighter-rouge">to_char</code>)</em></li>
  <li>Improves interfacing (<code class="language-plaintext highlighter-rouge">std::stringstream</code> with <code class="language-plaintext highlighter-rouge">std::string_view</code>), concatenations (<code class="language-plaintext highlighter-rouge">std::strings</code> and <code class="language-plaintext highlighter-rouge">std::string_views</code>), and arythmetic overloads (<code class="language-plaintext highlighter-rouge">std::to_string</code> and <code class="language-plaintext highlighter-rouge">std::format</code>).</li>
</ul>

<h4 id="stdinplace_vector"><code class="language-plaintext highlighter-rouge">std::inplace_vector</code></h4>

<ul>
  <li>Drop-in replacement for <code class="language-plaintext highlighter-rouge">std::vector</code> in memory-constrained contexts, dynamically resizable with compile-time fixed capacity.</li>
  <li>See <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p0843r8.html">P0843R8</a></li>
</ul>

<h4 id="stdformat"><code class="language-plaintext highlighter-rouge">std::format</code></h4>

<ul>
  <li>Expanded support for pointers and newlines.</li>
</ul>

<h4 id="ranges"><code class="language-plaintext highlighter-rouge">&lt;ranges&gt;</code></h4>

<ul>
  <li>New views <code class="language-plaintext highlighter-rouge">std::ranges::generate_random</code> and <code class="language-plaintext highlighter-rouge">std::ranges::concat_view</code>.</li>
</ul>

<h4 id="more-constexpr-support">More <code class="language-plaintext highlighter-rouge">constexpr</code> support</h4>

<ul>
  <li><code class="language-plaintext highlighter-rouge">&lt;algorithm&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;ranges&gt;</code>: <code class="language-plaintext highlighter-rouge">std::stable_sort</code>, <code class="language-plaintext highlighter-rouge">std::stable_partition</code>, <code class="language-plaintext highlighter-rouge">std::inplace_merge</code></li>
  <li><code class="language-plaintext highlighter-rouge">&lt;linealg&gt;</code>: free-function algebra interface based on <a href="https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms">BLAS</a></li>
</ul>

<h4 id="stdsubmdspan"><code class="language-plaintext highlighter-rouge">std::submdspan</code></h4>

<ul>
  <li>Improvement of C++23’s <code class="language-plaintext highlighter-rouge">std::mdspan</code></li>
  <li>See <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2630r4.html">P2630r4</a></li>
</ul>

<h4 id="debugging-support">Debugging support</h4>

<ul>
  <li><code class="language-plaintext highlighter-rouge">std::breakpoint</code></li>
  <li><code class="language-plaintext highlighter-rouge">std::is_debugger_present</code></li>
  <li><code class="language-plaintext highlighter-rouge">std::breakpoint_if_debugging</code>: <code class="language-plaintext highlighter-rouge">if (std::is_debugger_present) std::breakpoint();</code>.</li>
</ul>

<h4 id="stdexecution-senderreceiver"><code class="language-plaintext highlighter-rouge">std::execution</code> (sender/receiver)</h4>

<ul>
  <li>
    <p>See <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html">P2300R10</a>, and the reference implementation <a href="https://github.com/NVIDIA/stdexec">NVIDIA/stdexec</a>.</p>
  </li>
  <li>Execution resources represent locations like GPUs or threadpools.</li>
  <li>Schedulers represent the execution resource, defined with <code class="language-plaintext highlighter-rouge">execution::schedule</code></li>
  <li>Senders describe tasks; receivers handle workflow termination.</li>
  <li>Sender types:
    <ul>
      <li>Factories : <code class="language-plaintext highlighter-rouge">execution::just</code>, <code class="language-plaintext highlighter-rouge">execution::just_error</code>.</li>
      <li>Consumers : <code class="language-plaintext highlighter-rouge">this_thread::sync_wait</code>.</li>
      <li>Adaptors  : <code class="language-plaintext highlighter-rouge">execution::then</code>, <code class="language-plaintext highlighter-rouge">execution::when_all</code>.</li>
    </ul>
  </li>
  <li>Receivers support three channels: value, error, stopped.</li>
</ul>

<h3 id="️-frances-buontempo-an-introduction-to-swarm-intelligence-algos">🗣️ Frances Buontempo: An introduction to swarm intelligence algos</h3>

<p><a href="https://meetingcpp.com/mcpp/slides/2024/SwarmMeetingCpp602422.pdf">📄 Slidedeck</a>.</p>

<p>Frances Buontempo presented an engaging introduction to swarm intelligence algorithms, blending theoretical insights with practical programming demonstrations. Her talk emphasized the simplicity and creativity behind implementing such algorithms, encouraging attendees to write code for fun and problem-solving.</p>

<p>As someone unfamiliar with such a topic, I found her presentation intellectually stimulating.<br />
The first slide title, <em>“Swarm to get your way out of a paper bag”</em> made me remember her earlier publications in <code class="language-plaintext highlighter-rouge">ACCU's Overload journal</code> <a href="https://accu.org/journals/overload/24/132/buontempo_2225/">“How to Diffuse Your Way Out of a Paper Bag”, 2016</a> and on <a href="https://www.researchgate.net/publication/309210110_How_to_diffuse_your_way_out_of_a_paper_bag">ResearchGate</a> about <a href="https://en.wikipedia.org/wiki/Brownian_motion">Brownian motion</a>, which inspired me years ago to begin experimenting with naive particle simulations and the <a href="https://www.sfml-dev.org/">SFML</a> as a playground.</p>

<h4 id="what-is-swarm-intelligence-">What is swarm intelligence ?</h4>

<p>Swarm intelligence refers to the <em>“emergent collective intelligence of a group of simple agents”</em>.<br />
Inspired by nature - <em>such as flocking birds or foraging ants</em> -, these metaheuristics are designed to tackle intractable optimization problems.</p>

<p>They operate using two fundamental modes:</p>

<ul>
  <li>Exploration: discovering new solutions (unexplored area of the feasble region)</li>
  <li>Exploitation: refining existing solutions (search of the neighborhood of a promising region)</li>
</ul>

<p>Metaheuristic search algorithms are broadly categorized into :</p>

<ul>
  <li>Trajectory-based approaches <em>(e.g., <a href="https://en.wikipedia.org/wiki/Simulated_annealing">simulated annealing</a>)</em>.</li>
  <li>Population-based approaches, which are also subcategorized into
    <ul>
      <li><a href="https://en.wikipedia.org/wiki/Evolutionary_computation">evolutionary computation</a></li>
      <li><a href="https://en.wikipedia.org/wiki/Swarm_intelligence">swarm intelligence</a> <em>(e.g., <a href="https://en.wikipedia.org/wiki/Particle_swarm_optimization">particle swarm optimization</a> &amp; variants)</em></li>
    </ul>
  </li>
</ul>

<blockquote>
  <p>[A.N] see also <a href="https://smartmobilityalgorithms.github.io/book/content/TrajectoryAlgorithms/index.html">AI Search Algorithms for Smart Mobility, 2021, by Alaa Khamis and Yinan Wang</a></p>
</blockquote>

<h4 id="particle-swarm-optimization-pso"><a href="https://en.wikipedia.org/wiki/Particle_swarm_optimization">Particle Swarm Optimization</a> (PSO)</h4>

<ul>
  <li>Agents (particles) have positions and velocities in a given space.</li>
  <li>They adjust their movement based on a formula involving constants.</li>
</ul>

<h4 id="ant-colony-optimization-aco"><a href="https://www.researchgate.net/publication/2330246_The_Ant_Colony_Optimization_Metaheuristic_Algorithms_Applications_and_Advances">Ant Colony Optimization</a> (ACO)</h4>

<ul>
  <li>Ants traverse grids or graphs, guided by virtual pheromones (numeric values).</li>
</ul>

<h4 id="abstract-bee-colony-abc"><a href="http://www.scholarpedia.org/article/Artificial_bee_colony_algorithm">Abstract Bee Colony</a> (ABC)</h4>

<p>See also <a href="https://www.researchgate.net/publication/324986068_A_Comprehensive_review_of_Artificial_Bee_Colony_Algorithm">A comprehensive review of artificial Bee Colony Algorithm</a></p>

<p>Bees assume distinct roles:</p>

<ul>
  <li><strong>Scouts</strong>: exploring new areas for resources, remember the best locations.</li>
  <li><strong>Workers</strong>: gathering food and investigate nearby.</li>
  <li><strong>Inactive</strong>: waiting at home to be recruited.</li>
</ul>

<p>Communication via a “waggle dance” recruits other bees to promising food sources.</p>

<h4 id="cat-swarm-optimization-cso"><a href="https://www.researchgate.net/publication/221419703_Cat_Swarm_Optimization">Cat Swarm Optimization</a> (CSO)</h4>

<ul>
  <li>A playful algorithm simulating cat behaviors.</li>
  <li>Steps involve sprinkling cats randomly in the solution space, memory pools for seeking, and tracing.</li>
  <li>Incorporates randomness and decision-making for problem-solving.</li>
</ul>

<h4 id="implementation--demonstrations">Implementation &amp; demonstrations</h4>

<p>Frances demonstrated implementations using the <a href="https://www.sfml-dev.org/">Simple and Fast Media Library (SFML)</a> , highlighting its simplicity for setting up a game loop and employing discrete distributions to model “how one could get the cat out of the bag.”</p>

<p>Her demo underscored how solving problems in a 2D rendering environment can be both engaging and educational. It showcased the power of creating, experimenting, and learning programming skills in a visually intuitive and fun way.</p>

<h3 id="️-timur-doumler-contracts-for-c">🗣️ Timur Doumler: Contracts for C++</h3>

<p>Timur Doumler provided an in-depth exploration of <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2900r10.pdf">P2900R10</a> and the concept of contracts in C++, explaining their role, benefits, and the new mechanisms introduced.</p>

<h4 id="what-are-contracts-and-why-do-they-matter-">What are contracts and why do they matter ?</h4>

<p>Contracts - rooted in the <a href="https://en.wikipedia.org/wiki/Design_by_contract">design by contract (DbC)</a> paradigm - define formal, precise, and verifiable interface specifications for software components.<br />
These extend typical function definitions with:</p>

<ul>
  <li><strong>Pre-conditions</strong>: conditions that must be true before function execution.</li>
  <li><strong>Post-conditions</strong>: conditions expected after function execution.</li>
  <li><strong>Invariants</strong>: conditions that remain constant during execution (e.g., class or loop invariants).</li>
</ul>

<p>Historically, C++ contracts were expressed as comments and documentations through <a href="https://en.cppreference.com/w/cpp/named_req">named requirements</a>, custom assertion macros (based on <code class="language-plaintext highlighter-rouge">&lt;cassert&gt;</code>), or even <code class="language-plaintext highlighter-rouge">if</code> used in conjunction with <code class="language-plaintext highlighter-rouge">throw</code> statements.<br />
<strong>P2900 “Contracts for C++”</strong> introduces contract assertions to express these directly in code, enhancing not only clarity and <strong>readability</strong>, but also <strong>tool support</strong>.</p>

<h4 id="the-purpose-of-contracts">The purpose of contracts</h4>

<p>Contracts allow programmers to:</p>

<ul>
  <li>Express <strong>expectations</strong> about program <strong>correctness</strong> (using pre/post-conditions).</li>
  <li>Verify these expectations dynamically to identify defects.</li>
  <li>Improve documentation, debugging, and static analysis without altering the program semantics.</li>
</ul>

<p>While contracts share similarities with unit tests, they <strong>are not</strong> error-handling mechanisms and focus on specifying program correctness rather than runtime behavior guarantees.</p>

<p>Contracts assertions are redundant, acting as additional layers of verification.</p>

<h4 id="p2900-main-features"><strong>P2900</strong> main features</h4>

<ul>
  <li><strong>Keywords</strong>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">pre</code> and <code class="language-plaintext highlighter-rouge">post</code> for function declarations.
        <ul>
          <li><code class="language-plaintext highlighter-rouge">post(r : r.isValid())</code> where <code class="language-plaintext highlighter-rouge">r</code> names the returned object</li>
        </ul>
      </li>
      <li><code class="language-plaintext highlighter-rouge">contract_assert</code> within function bodies.</li>
    </ul>
  </li>
  <li>Seamless integration
    <ul>
      <li>Unlike macros, contracts are fully integrated into the language and support modern C++ features like copy-elision.
        <ul>
          <li><code class="language-plaintext highlighter-rouge">ret</code> in <code class="language-plaintext highlighter-rouge">post(ret: ....)</code> refers to the value in the caller side</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h4 id="practical-implementation-and-integration">Practical implementation and integration</h4>

<ul>
  <li>A customizable contract <strong>violation handler</strong>, defined program-wide.</li>
  <li>Integration with the standard library using header <code class="language-plaintext highlighter-rouge">&lt;contracts&gt;</code>, in namespace <code class="language-plaintext highlighter-rouge">std::contracts</code>.</li>
  <li>Implicit constification of variables in contract predicates to ensure safety.</li>
</ul>

<h4 id="evaluation-semantics">Evaluation semantics</h4>

<p>Contracts can be evaluated with different semantics, allowing flexibility based on performance and safety requirements:</p>

<ul>
  <li><strong>Ignore</strong>: Parse but do not check the predicate.</li>
  <li><strong>Observe</strong>: Check the predicate, call the <strong>violation handler</strong> on failure, then continue.</li>
  <li><strong>Enforce</strong> (default): Check the predicate, call the violation handler, and <strong>terminate</strong> on failure.</li>
  <li><strong>Quick_enforce</strong>: Terminate immediately on predicate check failure.</li>
  <li><em>(not part of P2900)</em> <strong>assume</strong>: do not check the predicate and optimise on the assumption that it is try <em>(understand: if false, the behaviour is undefined)</em></li>
</ul>

<p>Such a choice is implementation defined, and can be defined either:</p>

<ul>
  <li>at compile-time <em>(e.g <code class="language-plaintext highlighter-rouge">-fcontract-semantic=enforce</code>)</em></li>
  <li>at load time</li>
  <li>at link time</li>
  <li>at runtime <em>(e.g enable with a debugger is attached)</em></li>
</ul>

<p>Which means that one can’t - <em>and should not, anyway</em> - rely on side-effect.</p>

<h4 id="challenges--limitations">Challenges &amp; limitations</h4>

<ul>
  <li>Contracts focus on runtime-verifiable predicates and cannot address all aspects of plain-language contracts<br />
(e.g <em>“points to an existing object”, “this function will return a value”, etc.</em>).</li>
  <li>They are <strong>not</strong> substitutes for <strong>formal correctness proofs</strong> or exhaustive static analysis.
    <blockquote>
      <p><em><strong>A.N</strong>: For exhaustive correctness and formal proof, see <a href="https://www.trust-in-soft.com/">TrustInSoft static analyzer</a>.</em></p>
    </blockquote>
  </li>
  <li>Writing <strong>predicates without side effects</strong> is critical to maintaining program semantics.</li>
</ul>

<blockquote>
  <p>What’s coming next/post-MVP ?</p>

  <ul>
    <li>Referring to “old” values at the time of call in contract checks.</li>
    <li>Expanding the scope of contracts to cover more advanced scenarios and improve their utility.</li>
    <li>See
      <ul>
        <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2461r0.pdf">P2461 - Closure-Based Syntax for Contracts</a></li>
        <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3098r1.pdf">P3098r1 - Postcondition captures</a></li>
      </ul>
    </li>
  </ul>
</blockquote>

<h4 id="conclusion--takeaway">Conclusion / takeaway</h4>

<ul>
  <li>Contracts provide a structured way to <strong>express and verify correctness expectations</strong>.</li>
  <li>Checks must be carefuly designed and used</li>
  <li>They enhance static analysis, documentation, and debugging <strong>without altering program behavior</strong>.</li>
  <li>While limited in scope, contracts - <em>as proposed by P2900</em> - lay a strong foundation for future extensions and <strong>safer programming practices</strong>.</li>
</ul>

<h3 id="️-jens-weller-meeting-c-update">🗣️ Jens Weller: Meeting C++ update</h3>

<p>Jens provided updates on the <strong>Meeting C++</strong> ecosystem,<br />
retrospecting about the platform’s growth over the last past 12 years, its strategic direction, and plans for the future.</p>

<h4 id="meeting-c-20">Meeting C++ 2.0</h4>

<ul>
  <li><strong>Online</strong> user groups, job fairs, and books &amp; tools fairs - using <a href="https://www.meetup.com/meeting-cpp-online/">meetup.meetingcpp.com</a> and <a href="https://meetingcpp.com/mcpp/online/">meetingcpp.com/mcpp/online/</a>.</li>
  <li><a href="https://meetingcpp.com/mcpp/online/jobfair.php"><strong>Job fairs</strong></a>: help connecting employers (using <a href="https://meetingcpp.com/mcpp/jobsubmission/">job board submissions</a>) with candidates through <a href="https://meetingcpp.com/mcpp/recruiting/cvupload.php">CV uploads</a> and visibility within the C++ community.</li>
  <li><a href="https://meetingcpp.com/mcpp/training/">Training</a></li>
  <li><a href="https://meetingcpp.com/mcpp/survey/">Survey</a>s</li>
</ul>

<h4 id="the-meeting-c-conference">The Meeting C++ conference</h4>

<ul>
  <li>Continues to refine its <strong>hybrid</strong> model - <em>since 2020</em> -, offering both onsite and online experiences - which is a real improvement when it comes to <strong>accessibility</strong>. And will keep it that way for the 2025 edition.</li>
  <li>Expand to more content (LinkedIn newsletter, sponsored blog articles, ads, etc.) and ways to monetized the reach.</li>
  <li><strong>2024</strong> recordings will be available to attendees post-conference on <a href="https://events.hubilo.com/meeting-cpp-2024">Hubilo</a>, then will later be available on the <a href="https://www.youtube.com/@MeetingCPP">MeetingCPP Youtube channel</a>.</li>
  <li><strong>2025</strong> will see enhanced tools like <a href="https://ti.to/home">Tito</a> for ticketing and <a href="https://www.eventbrite.com/">Eventbrite</a> integration.
    <ul>
      <li>The call for paper will start in April 2025, and will probably end in July.</li>
    </ul>
  </li>
</ul>

<h4 id="future-vision-meeting-c-30">Future vision: Meeting C++ 3.0</h4>

<ul>
  <li>Expansion into mentoring and commercial training offerings.</li>
  <li>Help more C++ users to create local meetup groups, offering advices on starting and running them.
    <ul>
      <li>Encouraged diverse formats, including C++ quizz, coding dojos, book clubs, and lightning talks, to attract varied audiences.</li>
    </ul>
  </li>
</ul>

<h3 id="-secrets-lightning-talks">⚡ Secrets Lightning talks</h3>

<h4 id="-ivan-cukic---a-brave-new-world">⚡ Ivan Cukic - a brave new world</h4>

<p>Ivan Cukic explored the growing focus on safety, energy efficiency, and the broader societal and environmental responsibilities of software development.<br />
He discussed how governments are beginning to regulate IT by responding to popular buzzwords,<br />
and how the C++ committee is reacting to these changes.</p>

<p>Ivan emphasized that the real challenge lies not in tools but in people.<br />
He proposed that - <em>like Agile principles</em> - safety should be a mindset rather than a strict set of tools and practices.<br />
This mindset should encompass a <strong>clear definition and manifesto</strong>, <strong>education</strong> for all developers, <strong>integration</strong> into the <strong>software development cycle</strong>, and <strong>regulations</strong> that genuinely improve outcomes for people.</p>

<p>Ivan concluded with a call to action: to <strong>educate</strong> developers and embrace this <em>“safe new world”</em> with a proactive and adaptable mindset.</p>

<h4 id="-hana-dusikova---hashing">⚡ Hana Dusikova - Hashing</h4>

<p>See this lightning talk’s <a href="https://www.youtube.com/watch?v=JOZdyukFCz4">video here</a>.</p>

<p>Hana introduced <a href="https://github.com/hanickadot/cthash">cthash</a>, her single-header C++ library for compile-time hashing,<br />
designed to offer a modern and user-friendly alternative to cumbersome APIs like <code class="language-plaintext highlighter-rouge">OpenSSL</code>’s.</p>

<p>Highlighting the verbosity of traditional C interfaces (e.g., <code class="language-plaintext highlighter-rouge">SHA256_init</code> + <code class="language-plaintext highlighter-rouge">SHA256_update</code> + <code class="language-plaintext highlighter-rouge">SHA256_final</code>),<br />
Hana demonstrated how <code class="language-plaintext highlighter-rouge">cthash</code> simplifies the process with clean, modern C++ syntax.
Streamlined/monadic API, and user-defined string literals <code class="language-plaintext highlighter-rouge">_sha256</code>.</p>

<p>Example from the <a href="https://github.com/hanickadot/cthash">project’s Github repository</a>:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="k">namespace</span> <span class="n">cthash</span><span class="o">::</span><span class="n">literals</span><span class="p">;</span>

<span class="k">constexpr</span> <span class="k">auto</span> <span class="n">my_hash</span> <span class="o">=</span> <span class="n">cthash</span><span class="o">::</span><span class="n">sha256</span><span class="p">{}.</span><span class="n">update</span><span class="p">(</span><span class="s">"hello there!"</span><span class="p">).</span><span class="k">final</span><span class="p">();</span>
<span class="c1">// or</span>
<span class="k">constexpr</span> <span class="k">auto</span> <span class="n">my_hash</span> <span class="o">=</span> <span class="n">cthash</span><span class="o">::</span><span class="n">simple</span><span class="o">&lt;</span><span class="n">cthash</span><span class="o">::</span><span class="n">sha256</span><span class="o">&gt;</span><span class="p">(</span><span class="s">"hello there!"</span><span class="p">);</span>

<span class="k">static_assert</span><span class="p">(</span><span class="n">my_hash</span> <span class="o">==</span> <span class="s">"c69509590d81db2f37f9d75480c8efedf79a77933db5a8319e52e13bfd9874a3"</span><span class="n">_sha256</span><span class="p">);</span>
</code></pre></div></div>

<h4 id="-james-mcnellis---my-least-favorite-c-feature">⚡ James Mc.Nellis - My <strong>least</strong> favorite C++ feature</h4>

<p>See this lightning talk <a href="https://www.youtube.com/watch?v=sjOCouCbKGI">video here</a>.</p>

<p>James’s least favorite C++ is not like some peoples template nor RAII, but <strong>functions pointers</strong>.<br />
Why that ? Mostly for a memory safety reason, which in this case lead to security vulnerabilities: attackers can override function pointers.<br />
James highlighted <a href="https://en.wikipedia.org/wiki/Control-flow_integrity">CFI (Control Flow Integrity)</a> technics, which can be used to make the code crash rather than executing the attacker’s code.</p>

<ul>
  <li>Clang CFI (<code class="language-plaintext highlighter-rouge">-fsanitize=cfi</code>)</li>
  <li>GCC <code class="language-plaintext highlighter-rouge">-fstack-protector</code></li>
  <li>Microsoft control flow guard <code class="language-plaintext highlighter-rouge">/guard:cf</code></li>
  <li>Armv8.3 pointer authentification</li>
</ul>

<p><a href="https://www.youtube.com/watch?v=tQwv79i02ks&amp;ab_channel=LinuxPlumbersConference">Where are we on security features? - Kees Cook, Qing Zhao, Linux Plumbers Conference</a></p>

<h4 id="-phil-nash---live-demo-using-undoio-tool-on-doom">⚡ Phil Nash - Live Demo using <code class="language-plaintext highlighter-rouge">Undo.io</code> tool on <code class="language-plaintext highlighter-rouge">Doom</code></h4>

<p>For this demonstration, the speaker used <code class="language-plaintext highlighter-rouge">chocolate-doom</code> (<a href="https://www.chocolate-doom.org/wiki/index.php/Chocolate_Doom">website</a>, <a href="https://github.com/chocolate-doom/chocolate-doom">github</a>) 
to illustrate how simple, efficient, and perhaps fun <a href="https://docs.undo.io/UsingTheLiveRecorderTool.html">Undo.io’s live-recorder</a> can be.</p>

<ul>
  <li>Started to play doom, while live-recording using <code class="language-plaintext highlighter-rouge">Undo</code>’s <code class="language-plaintext highlighter-rouge">live-recorder</code>.</li>
  <li>Then ran the recorded <code class="language-plaintext highlighter-rouge">.undo</code> file, which immediatly stops at the point when the record ended.</li>
  <li>Demonstrated how display a frame with the game buffer in memory.</li>
  <li>Asked the audience for a <code class="language-plaintext highlighter-rouge">(x,y)</code> coordinates: 206 and 148.</li>
  <li>Used the undo command line <code class="language-plaintext highlighter-rouge">last</code> to find out the last time a specific address in memory was changed,<br />
here the pixel matching the x,y coordinates chosed by the audience <code class="language-plaintext highlighter-rouge">last I_VideoBuffer[206+148*320]</code>,<br />
effectively rewinding and pausing the execution back to this very moment.</li>
  <li>Then find out when was the last time an ennemy was on that pixel, and its matching memory address.</li>
  <li>
    <p>As the ennemy’s health at this moment is <code class="language-plaintext highlighter-rouge">0</code>,<br />
then rewind the record back to the precise moment such thing was alive.</p>

    <p>The <code class="language-plaintext highlighter-rouge">last thing-&gt;health</code> command then lead to <code class="language-plaintext highlighter-rouge">target-&gt;health -= damage</code>,<br />
with the old value <code class="language-plaintext highlighter-rouge">0</code> and the new value <code class="language-plaintext highlighter-rouge">5</code></p>
  </li>
  <li>Show the matching rendered game frame, which is exactly when the player killed that ennemy.</li>
</ul>

<h4 id="-titus-winters---on-parameter-sinks">⚡ Titus Winters - On parameter sinks</h4>

<p>See this lightning talk <a href="https://www.youtube.com/watch?v=iH86aQrzIKU">video here</a>.</p>

<p>Titus Winters delved into the considerations of API design and parameter passing in contemporary C++.</p>

<ul>
  <li>
    <p><strong>Rvalue</strong> references (<code class="language-plaintext highlighter-rouge">&amp;&amp;</code>) and move semantics</p>

    <p>Rvalue references <strong>may</strong> be moved but are not inherently moved - but it’s a common misconception that rvalue references always guarantee a move.</p>
  </li>
  <li>
    <p><strong>Overload sets</strong> are the fundamental unit of API design in C++</p>

    <p><em>“Overload operations that are roughly equivalent”</em>, <a href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c162-overload-operations-that-are-roughly-equivalent">C++ Core Guidelines, C.162</a>.<br />
Ensure APIs clarify intent, aligning function signatures with how resources are managed.</p>
  </li>
  <li>
    <p>Functions call cost and move operation <strong>cost</strong></p>

    <ul>
      <li>Whether data is too expensive to copy is a property of the type, not of a function.</li>
      <li>
        <p>Cost of function ~= cost of a move: <strong>overload set</strong></p>

        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">f</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">);</span>
<span class="n">f</span><span class="p">(</span><span class="n">T</span><span class="o">&amp;&amp;</span><span class="p">);</span>
</code></pre></div>        </div>
      </li>
      <li>
        <p>Cost of function &gt; cost of a move: pass <strong>by value</strong>, don’t care about the extra move operation.</p>

        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">f</span><span class="p">(</span><span class="n">T</span><span class="p">);</span>
</code></pre></div>        </div>
      </li>
      <li><strong>Maybe</strong> move ? Such a function had better returns the information is the parameter were actually moved.</li>
    </ul>
  </li>
</ul>

<h4 id="-jens-weller---networking">⚡ Jens Weller - Networking</h4>

<p>Jens shared some insights on common patterns in his networking code,<br />
emphasizing the importance of async programming and robust data handling in scenarios like authentication protocols.</p>

<p>He mentioned:</p>

<ul>
  <li>Popular libraries like <a href="https://doc.qt.io/qt-6/qnetworkaccessmanager.html">QNetworkManager</a>, <a href="https://pocoproject.org/">POCO</a>, and <a href="https://www.boost.org/doc/libs/1_83_0/doc/html/boost_asio.html">Boost.Asio</a> to implement asynchronous task jobs.</li>
  <li>Data management strategies, included handling formats like <code class="language-plaintext highlighter-rouge">JSON</code>, <code class="language-plaintext highlighter-rouge">XML</code>, raw binary, and compressed streams</li>
  <li>Alongside with error-handling considerations.</li>
</ul>

<h3 id="️-peter-sommerlad-collective-amnesia">🗣️ Peter Sommerlad: Collective Amnesia?</h3>

<p><a href="https://www.youtube.com/watch?v=g6QYGW-TwwY">🎥 Video</a>, <a href="https://meetingcpp.com/mcpp/slides/2024/Collective%20Amnesia969332.pdf">📄 slidedeck</a> <em>(shared using a <strong>QR code</strong> on the first slide of the deck !)</em>.</p>

<blockquote>
  <p><em>“Pay attention - don’t become the grumpy old man ranting”</em><br />
[A.N] From my perspective, definitly a keynote every developer should attend to or watch online !</p>
</blockquote>

<p>In his talk, - <em>with a notable frank speaking</em> - Peter explored the phenomenon of <em>“Collective amnesia”</em> in software development:<br />
our tendency to forget <strong>timeless principles</strong>, <strong>proven practices</strong>, and <strong>historical lessons</strong> in favor of <strong>trends</strong>, <strong>complexity</strong>, or <strong>convenience</strong>.<br />
He encouraged revisiting and applying foundational concepts to modern development, in order to stop repeating the same mistakes over and over again.</p>

<blockquote>
  <p>For examples, he mentioned that <strong>CO2 causing global warming</strong> were something studied more than a century ago - <em>see <a href="https://www.rsc.org/images/arrhenius1896_tcm18-173546.pdf">“On the influence of carbonic acid in the air upon global warming”, 1896, Svante Arrhenius</a></em> -,<br />
and - <em>as a <a href="https://en.wikipedia.org/wiki/Godwin%27s_law">Godwin’s law</a> point</em> -, that the current <strong>rise of fascism</strong> one can observe all over the world: world war 2 is <strong>NOT</strong> a thing to repeat <strong>ever</strong> <em>(concentration camps, etc.)</em>.</p>
</blockquote>

<h4 id="why-do-we-forget-">Why do we forget ?</h4>

<p>Amnesia &amp; nostalgia</p>

<ul>
  <li>Forgetting past insights and <strong>overvaluing recent trends</strong>.</li>
  <li>However, nostalgia leads to overlooking the positive aspects of past practices.</li>
</ul>

<p>Neglected knowledge</p>

<ul>
  <li>Well-established principles <em>(e.g., modularity, type systems)</em> and <strong>scientific evidence</strong> are ignored.</li>
  <li>Proven practices - <em>like unit testing, DRY/OAOO, refactoring, etc.</em> - are underutilized.</li>
</ul>

<p>Cultural and structural factors</p>

<ul>
  <li>Advances in hardware promote inefficient software.</li>
  <li><strong>Trend-driven development</strong> repeats mistakes.</li>
  <li><strong>Buzzwords-driven design</strong>: e.g <em>AI, ML, VR, cloud, blockchain, XML, Java/EJB, CORBA, etc.</em></li>
  <li>Powerful men influence/impact: drunk by power, money and eagerness for control while being socially irresponsible, which results in too few benefit at the cost of most.</li>
  <li>Lack of investment in <strong>education</strong> and <strong>fundamentals</strong>: Badly paid teachers/trainers teaching obselete technics, while techs suffer from a long learning curve.</li>
</ul>

<p>Risk aversion and populism</p>

<ul>
  <li>Following the crowd for safety - e.g <em>“if everybody is doing it, we also should”, “nobody gets fired for buying IBM/Cisco”</em>.</li>
  <li><strong>Simplistic</strong> (loud) solutions and <strong>populist thinking</strong> overshadow <strong>realistic</strong> (calm) approaches.</li>
  <li>Ignorance, lack of pragmatism/forecasting: cost &amp; consequences of a trend.</li>
</ul>

<h4 id="forgotten-foundations">Forgotten foundations</h4>

<p>Timeless principles</p>

<ul>
  <li>Simplicity, <strong>SoC</strong> <em>(separation of concerns)</em>, high cohesion, loose coupling, testability, and exchangeability,<br />
which often result in <strong>untestable</strong> product, and <strong>unmaintainable</strong> codebase - <em>thus no more delivered <strong>value</strong></em>.</li>
  <li>Neglecting these principles increases <strong>long-term costs</strong> and <strong>complexity</strong>.</li>
</ul>

<p>Historical insights</p>

<ul>
  <li><strong>Modularization</strong>: Independence, changeability, SoC, and hiding design decisions.<br />
<em><a href="https://dl.acm.org/doi/10.1145/361598.361623">“On the criteria to be used in decomposing systems into modules”, <strong>1972</strong>, D.L. Parnas</a></em></li>
  <li><strong>Type systems</strong>: Clarity and prevention of misinterpretation.<br />
<em><a href="https://www.classes.cs.uchicago.edu/archive/2007/spring/32001-1/papers/church-1940.pdf">“A Formulation of the Simple Theory of Types”, <strong>1940</strong>, A. Church</a></em></li>
  <li><strong>Refactoring</strong>: Continuous improvement of existing code.<br />
<em><a href="https://www.researchgate.net/publication/2498589_Refactoring_Object-Oriented_Frameworks">“Refactoring Object-Oriented Frameworks”, <strong>1992</strong>, William F. Opdyke &amp; Ralph Johnson</a></em></li>
  <li><strong>Unit Testing</strong>: A proven practice often overlooked.<br />
<em><a href="https://web.archive.org/web/20150315073817/http://www.xprogramming.com/testfram.htm">“Simple Smalltalk Testing: With Patterns”, <strong>1989</strong>, Kent Beck</a></em></li>
</ul>

<h4 id="software-architecture-and-design-patterns">Software architecture and design patterns</h4>

<blockquote>
  <p>“Lower quality is the <strong>most expensive thing</strong> in software: Good-enough is never good-enough.”</p>
</blockquote>

<p>Pitfalls</p>

<ul>
  <li>Often biaised and reduced to 23 <a href="https://www.digitalocean.com/community/tutorials/gangs-of-four-gof-design-patterns">GoF design patterns</a>.</li>
  <li>Overemphasis on cloud, distribution, and increasing complexity.</li>
  <li>Ignoring internal quality and codebase, leading to hard-to-maintain systems.</li>
</ul>

<p>Dependencies management</p>

<ul>
  <li>Avoid singletons, global variables, and hidden side effects.</li>
  <li>Avoid tight-couplings and hidden relationships.</li>
  <li>Refactor regularly to improve maintainability.</li>
</ul>

<p>Caution with patterns</p>

<ul>
  <li>Understand liabilities before adopting patterns.</li>
  <li><strong>Layers</strong> and <strong>tiers</strong> must balance abstraction and granularity.</li>
  <li>Challenge designs and architecture decisions.</li>
</ul>

<h4 id="the-c-type-system-as-a-key-tool">The C++ type system as a key tool</h4>

<ul>
  <li>Ensures meaning &amp; safety: associating types with expressions and entities, preventing misinterpretation of data and raising errors when meaningless operations are attempted.</li>
  <li>Facilitates efficient &amp; flexible code: detects type errors with strong safety, supports both implicit &amp; explicit conversions, and enables type deduction through features like auto and templates, for a smaller and more flexible code.</li>
</ul>

<h4 id="best-practices">Best practices</h4>

<p>Testing</p>

<ul>
  <li>Replace interactive debugging with <strong>automated testing</strong>.</li>
  <li>Favor <a href="https://en.wikipedia.org/wiki/Test-driven_development">TDD</a> for immediate feedbacks.</li>
  <li>Write <a href="https://www.youtube.com/watch?v=cfh6ZrA19r4&amp;ab_channel=MeetingCpp">Good Unit Tests (GUTS)</a>.</li>
</ul>

<p>Simplicity over complexity</p>

<ul>
  <li>Refactor mercilessly, <em>as a demonstration of <strong>love</strong> to your future self and colleagues</em>.
    <ul>
      <li>Focus on naming, function &amp; classes granularity, parameterization, and algorithms.</li>
    </ul>
  </li>
  <li>Less code equals more software, move value.</li>
  <li>Start with the simplest solution, not the newest nor a complicated one.</li>
</ul>

<h4 id="conclusion-key-takeaway-and-broader-thoughts">Conclusion, key takeaway, and broader thoughts</h4>

<p>Human/societal lessons</p>

<ul>
  <li>Learn from history to avoid repeating mistakes (e.g., climate crisis, fascism).</li>
  <li>Promote responsibility, equity, and sustainable practices.</li>
</ul>

<p>Developer mindset</p>

<ul>
  <li>Love your codebase by simplifying and improving it for future maintainers.</li>
  <li>Prioritize timeless principles over fleeting trends.</li>
</ul>

<p>Takeaways</p>

<ul>
  <li>Revive and apply forgotten software principles.</li>
  <li>Simplify architecture and code through regular testing and refactoring.</li>
  <li>Embrace C++’s strengths to write maintainable and efficient software.</li>
  <li>Act responsibly in both software and societal contexts by valuing simplicity, sustainability, and human connection.</li>
</ul>

<h4 id="additional-inputs-from-questions">Additional inputs from questions</h4>

<ul>
  <li>Peoples who are not willing to learn continuously should not be doing softwares. Learning is a life-long experience.</li>
  <li>
    <p>Code should not even be consider existing if it not paired with tests.</p>
  </li>
  <li>
    <p><strong>Question</strong>: What are your thoughts about mocking ?<br />
<strong>Answer</strong>: CppCon-2017: mocking considered harmful. It hides dependencies. Make the codebase less likely to change, in order not to break changes.</p>
  </li>
  <li><strong>Question</strong> (me): Any advise for a professional C++ trainer who struggle a lot with juniors strong beliefs,<br />
and the inertia we have in the academic which often make teachers to teach very deprecated content ?<br />
Same to fight dogmas, and bring more pragmatism into leaders/managers mind ?<br />
<strong>Answer</strong>: There’s no easy answer. Had to quit my jobs before when my values were too much violated.<br />
It’s always hard to solve peoples problems because it involes peoples.<br />
Show love. Peer-programming actually works. Build trust, learn new things. Code katas.</li>
</ul>

<h2 id="conclusion-5">Conclusion</h2>

<p>Attending Meeting C++ 2024 was, as always, an very enjoyable and interesting experience.<br />
The event provided an incredible blend of technical depth and thought-provoking discussions on broader topics that resonated with the C++ community current concerns and needs.<br />
I particularly appreciated how some talks and keynotes echoed and complemented each others, weaving a coherent narrative across diverse sessions.<br />
This interplay added significant value to the conference and highlighted the care put into curating the program.</p>

<p>Another standout aspect was the inclusion of more talks that focused not just on technical challenges but also on delivering value sustainably, while preserving developers’ mental and physical health.<br />
These sessions offered underscored the importance of fostering a holistic and pragmatic approach to software development.</p>

<p>I would like to extend my heartfelt thanks to Jens and all the organizers for their dedication and hard work in making this event a success.<br />
My gratitude also goes to the speakers, who shared their insights and expertise, and to the sponsors, whose support made this gathering possible.<br />
Together, they created an environment that inspires learning, collaboration, and growth.</p>

<p><em>One area for improvement, however, was the scheduling system, particularly for remote attendees managing time zone differences.<br />
While the MeetingCpp and Hubilo platforms allow users to set their own time zones, the feature felt buggy.<br />
For instance, selecting Paris CET resulted in the schedule being shifted one hour earlier, despite Berlin *(where the conference is hosted)</em> and Paris are sharing the same time zone.<br />
Addressing this issue would enhance the remote attendee experience next year.*</p>

<p>Also, while attending the conference remotely, I had a great experience interacting with the online chat during talks,<br />
and really appreciated that some of my questions were upvoted and asked to the speakers.</p>

<p>I definitly look forward for next year’s event (perhaps, on-site !).<br />
The Meeting C++ conference is like fine wine or aged cheese: each year adds depth and character, refining the experience and making it richer, more rewarding, and ever more enjoyable with age.<br />
I’m excited to see what 2025 will bring!</p>

<p>Until then, take care, keep learning &amp; love C++. See you folks !</p>

<p>Guillaume.</p>

<hr />

<p>If you enjoyed this paper:</p>

<ul>
  <li>👍 Consider leaving a <em>“like”</em> and a <strong>comment</strong> - at the bottom of this page, and on <strong>LinkedIn</strong>.</li>
  <li>📩 Share this paper with your friends, colleagues, teachers, students.</li>
  <li>📖 You might be interested in last year’s: <a href="https://gist.github.com/GuillaumeDua/d6a82cd83178a38566464a78505a2669">Conference - Meeting Cpp 2024 - Trip report</a>.</li>
</ul>]]></content><author><name>Guillaume Dua</name><email>pro.guillaume.dua+blog@gmail.com</email></author><category term="cpp" /><category term="trip-report" /><category term="meeting-cpp" /><category term="conference" /><summary type="html"><![CDATA[My trip report for the Meeting Cpp 2024 conference]]></summary></entry></feed>