<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <channel>
    
    <title><![CDATA[Standard C++ | Articles & Books]]></title>
    <link>http://isocpp.org/blog</link>
    <description></description>
    <dc:language>en</dc:language>
    <dc:rights>Copyright 2025</dc:rights>
    <admin:generatorAgent rdf:resource="https://expressionengine.com/" />
    

    <item>
      <title>Structured Bindings in C++17, 8 Years Later &#45;&#45; Bartlomiej Filipek</title>
      <link>https://isocpp.org//blog/2025/10/structured-bindings-in-cpp17-8-years-later-bartlomiej-filipek</link>
      <guid>https://isocpp.org//blog/2025/10/structured-bindings-in-cpp17-8-years-later-bartlomiej-filipek</guid>
      <description><![CDATA[<p>
	<img alt="Filipek-structuredbindings.png" src="https://isocpp.org/files/img/Filipek-structuredbindings.png" style="width: 400px; margin: 10px; float: right;" />Structured binding is a C++17 feature that allows you to bind multiple variables to the elements of a structured object, such as a tuple or struct. This can make your code more concise and easier to read, especially when working with complex data structures. On this blog, we already covered this functionality, but we&rsquo;ll talk about some good C++26 additions and real code use cases.</p>
<blockquote>
	<h3>
		<a href="https://www.cppstories.com/2025/structured-bindings-cpp26-updates/">Structured bindings in C++17, 8 years later</a></h3>
	<p>
		by Bartlomiej Filipek</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		An excellent demonstration of structured bindings is an iteration through a map object.</p>
	<p>
		If you have a&nbsp;<code>std::map</code>&nbsp;of elements, you might know that internally, they are stored as pairs of&nbsp;<code>&lt;const Key, ValueType&gt;</code>.</p>
	<p>
		Now, when you iterate through elements, you can do:</p>
	<div>
		<pre tabindex="0">
<code data-lang="cpp">for (const auto&amp; elem : myMap) { ... } </code></pre>
	</div>
	<p>
		You need to write&nbsp;<code>elem.first</code>&nbsp;and&nbsp;<code>elem.second</code>&nbsp;to refer to the key and the value.</p>
	<div>
		<pre tabindex="0">
<code data-lang="cpp">std::map&lt;KeyType, ValueType&gt; myMap = getMap(); &#10;// C++14: &#10;for (const auto&amp; elem : myMap) {  &#10;     // elem.first - is the key  &#10;     // elem.second - is the value &#10;}</code></pre>
	</div>
</blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 09 Oct 2025 19:43:16 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>You should use QPainterPath they said...</title>
      <link>https://isocpp.org//blog/2025/10/you-should-use-qpainterpath-they-said</link>
      <guid>https://isocpp.org//blog/2025/10/you-should-use-qpainterpath-they-said</guid>
      <description><![CDATA[<p>
	A blog entry about this years t-shirt at Meeting C++ 2025 and exploring QPainterPath for it.</p>
<blockquote>
	<h2>
		<a href="https://meetingcpp.com/blog/items/You-should-use-QPainterPath-they-said---.html">You should use QPainterPath they said...</a></h2>
	<p>
		by Jens Weller</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		This post is about what I learned while playing around with QPainterPath for this years t-shirt at Meeting C++ 2025 sponsored by Hudson River Trading.</p>
	<p>
		One of the issues from last years t-shirt was when using drawText from QPainter, one does not really *draw* text in an svg exported. Instead you&#39;ll get the text and the font kinda embedded in an svg. What good is that in a vector graphic? This was a bit of a surprise when I ran into issues with this last year during printing. While this could be solved with the printing company picking a different font, it would have been also solved by using QPainterPath. At least this was the feedback from some of the Qt experts present onsite or online...</p>
	<p>
		&nbsp;</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 08 Oct 2025 17:22:39 +0000</pubDate>
      <dc:creator>Meeting C++</dc:creator>
    </item>

    <item>
      <title>How to Look up Values in a Map &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/10/how-to-look-up-values-in-a-map-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/10/how-to-look-up-values-in-a-map-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 204px;" />Whether you&rsquo;re in a coding interview or writing production code, you&rsquo;ll eventually face the question:&nbsp;<em>What&rsquo;s the right way to look up values in a&nbsp;<code>std::map</code>&nbsp;or&nbsp;<code>std::unordered_map</code>?</em>&nbsp;For simplicity, we&rsquo;ll refer to both containers as&nbsp;<em>maps</em>&nbsp;in this post.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/08/27/lookup-value-in-map">How to Look up Values in a Map</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Let&rsquo;s explore the different options &mdash; along with their pros and cons.</p>
	<p id="operator">
		<strong><code>operator[]</code></strong></p>
	<p>
		Using&nbsp;<code>operator[]</code>&nbsp;is the old-fashioned way to access elements of a map. It takes a key and returns a reference to the corresponding value. The complexity is&nbsp;<em>log(n)</em>&nbsp;for&nbsp;<code>std::map</code>&nbsp;and&nbsp;<em>average constant time</em>&nbsp;(with worst-case linear) for&nbsp;<code>std::unordered_map</code>.</p>
	<p>
		However, there&rsquo;s a big caveat.</p>
	<p>
		What if the key is not present in the map?</p>
	<p>
		Unlike a&nbsp;<code>vector</code>&nbsp;&mdash; where accessing an invalid index with&nbsp;<code>operator[]</code>&nbsp;leads to undefined behavior &mdash; a&nbsp;<code>map</code>&nbsp;will instead insert a new entry with the given key and a default-constructed value. This side effect makes&nbsp;<code>operator[]</code>&nbsp;unsafe for lookups where insertion is not desired.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 01 Oct 2025 19:39:59 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Safely passing strings and string_views &#45;&#45; Niek J Bouman</title>
      <link>https://isocpp.org//blog/2025/09/safely-passing-strings-and-string_views</link>
      <guid>https://isocpp.org//blog/2025/09/safely-passing-strings-and-string_views</guid>
      <description><![CDATA[<p>
	Passing a string temporary into a string_view can make the latter dangling&nbsp;</p>
<blockquote>
	<h3>
		<a href="https://niekbouman.blogspot.com/2025/07/safely-passing-stdstrings-and.html">Safely passing std::strings and std::string_view</a></h3>
</blockquote>
<blockquote>
	<p>
		by Niek J Bouman</p>
</blockquote>
<p>
	<em>From the article:</em></p>
<blockquote>
	<p>
		Many of you will agree that C++ is a language that comes with sharp edges. One example is `std::string_view`; introduced as a type to prevent unnecessary std::string-copies, but it introduces a new footgun, namely when passing a temporary string into it:</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 27 Sep 2025 21:01:08 +0000</pubDate>
      <dc:creator>niekb</dc:creator>
    </item>

    <item>
      <title>A safer C++ pointer class &#45;&#45; Niek J. Bouman</title>
      <link>https://isocpp.org//blog/2025/09/a-safer-cpp-pointer-class-niek-bouman</link>
      <guid>https://isocpp.org//blog/2025/09/a-safer-cpp-pointer-class-niek-bouman</guid>
      <description><![CDATA[<p>
	Sometimes some object A needs to interact with another object B, e.g., A calls one of B&rsquo;s methods. In a language like C++, it is left to the programmer to assure that B outlives A; if B happens to be already destructed, this would be a use-after-free bug. Managing object lifetimes can be tricky, especially with asynchronous code.</p>
<blockquote>
	<h3>
		<a href="https://techblog.rosemanlabs.com/c++/safety/object-lifetime/2025/08/28/a-safe-pointer-that-protects-against-use-after-free-and-updates-when-the-pointee-is-moved.html">A safe pointer in C++ that protects against use after free and updates when the pointee is moved</a></h3>
	<p>
		by Niek J. Bouman</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		We propose a design for a safe pointer to an object of type T that is weak in that it does not have ownership semantics, and gets notified in case the pointee is either destructed or moved.</p>
	<p>
		We will pay a price at runtime for these extra guarantees in terms of a small heap-allocated state, a double pointer indirection when accessing the pointee (comparable to a virtual function call), and a check against nullptr.</p>
	<p>
		The main idea of our design is to internally use a <code>std::shared_ptr&lt;T*&gt;</code> to share ownership of a (heap-allocated) pointer T*. The ownership is shared by the pointee and all <code>safe_ptr&lt;T&gt;</code> instances. The pointee type T must derive from the base class <code>safe_ptr_factory</code> (templated on T, using the Curiously Recurring Template Pattern) with a destructor that automatically notifies the shared state about destruction by setting T* to <code>nullptr</code>, and with a move constructor and move assignment operator that update T* to the new this pointer (which we must properly cast with <code>static_cast&lt;T*&gt;</code>). The double indirection thus comes from having to dereference the <code>shared_ptr</code> to obtain an ordinary pointer T*, after which you must dereference once more to access the pointee. You might recognize an instance of Gang-of-Four&rsquo;s observer pattern in our design.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 27 Sep 2025 20:59:03 +0000</pubDate>
      <dc:creator>niekb</dc:creator>
    </item>

    <item>
      <title>Linus Torvalds and the Supposedly Garbage Code &#45;&#45; Giovanni Dicanio</title>
      <link>https://isocpp.org//blog/2025/09/linus-torvalds-and-the-supposedly-garbage-code-giovanni-dicanio</link>
      <guid>https://isocpp.org//blog/2025/09/linus-torvalds-and-the-supposedly-garbage-code-giovanni-dicanio</guid>
      <description><![CDATA[<p>
	Some reflections on a harsh critic by Linus Torvalds on a RISC-V Linux kernel contribution.&nbsp;</p>
<blockquote>
	<h3>
		<a href="https://giodicanio.com/2025/08/27/linus-torvalds-and-the-supposedly-garbage-code/">Linus Torvalds and the Supposedly &ldquo;Garbage Code&rdquo;</a></h3>
</blockquote>
<blockquote>
	<p>
		by Giovanni Dicanio</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		So, the correct explicit code is not something as simple as &ldquo;(a &lt;&lt; 16) + b&rdquo;.</p>
	<p>
		[...]&nbsp;As you can see, the type casts, the parentheses, the potential bit-masking, do require attention. But once you get the code right, you can safely and conveniently reuse it every time you need!</p>
</blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 27 Sep 2025 20:54:24 +0000</pubDate>
      <dc:creator>Giovanni Dicanio</dc:creator>
    </item>

    <item>
      <title>CppCon 2025 Trip Report – tipi.build by EngFlow</title>
      <link>https://isocpp.org//blog/2025/09/cppcon-2025-trip-report-tipi.build-by-engflow</link>
      <guid>https://isocpp.org//blog/2025/09/cppcon-2025-trip-report-tipi.build-by-engflow</guid>
      <description><![CDATA[<p>
	CppCon 2025 was packed with exciting talks, deep dives, and great conversations.</p>
<blockquote>
	<h3>
		<a href="https://tipi.build/blog/20250925-CppCon2025">CppCon 2025 Trip Report</a></h3>
	<p>
		by&nbsp;tipi.build by EngFlow</p>
</blockquote>
<p>
	About the report</p>
<blockquote>
	<p>
		tipi.build by EngFlow attended both as a developer team and as a CppCon sponsor. Discover in our trip report the highlights from the sessions we attended and the talks we gave, How monday&rsquo;s afternoon break started with ice cream + key takeaways and resources if you&rsquo;d like to dive deeper.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books, Events,]]></dc:subject>
      <pubDate>Sat, 27 Sep 2025 20:50:20 +0000</pubDate>
      <dc:creator>daminetreg</dc:creator>
    </item>

    <item>
      <title>C++26: Concept and variable&#45;template template&#45;parameters &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/09/cpp26-concept-and-variable-template-template-parameters-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/09/cpp26-concept-and-variable-template-template-parameters-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />Last week,&nbsp;<a href="https://www.sandordargo.com/blog/2025/08/13/use-concepts-with-remove_cvref">we discussed why we should sometimes use&nbsp;<code>remove_cvref_t</code>&nbsp;on our template parameters before applying concepts to them</a>. We also saw that the solution is not super readable because we lose access to the terse, shorthand syntax.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/08/20/cpp26-P2841">C++26: Concept and variable-template template-parameters</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		C++ already allows passing templates as template parameters, but only if they are class templates. A common reason for doing this is to allow higher-level abstractions. For instance, you may want to pass in a container template like&nbsp;<code>std::vector</code>, without specifying the type it contains.</p>
	<p>
		Jason Turner explains this well in&nbsp;<a href="https://www.youtube.com/watch?v=s6Cub7EFLXo">C++ Weekly - Ep 368 - The Power of template-template Parameters: A Basic Guide</a>, but here&rsquo;s his example for quick reference:</p>
	<pre class="prettyprint lang-cpp">
template&lt;template &lt;typename Contained, typename Alloc = std::allocator&lt;Contained&gt;&gt;&#10;&#9;&#9; typename ResultType&gt;&#10;auto get_data() {&#10;&#9;ResultType&lt;double&gt; result;&#10;&#9;// ...&#10;&#9;return result;&#10;}&#10;&#10;int main() {&#10;&#9;auto data = get_data&lt;std::vector&gt;();&#10;}</pre>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 25 Sep 2025 22:20:21 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Use concepts with std::remove_cvref_t &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/09/use-concepts-with-stdremove-cvref-t-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/09/use-concepts-with-stdremove-cvref-t-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />Let&rsquo;s talk about templates, constraints, and concepts. We&rsquo;ll start with a quick reminder of why concepts are essential when working with templates. Then we&rsquo;ll dive into the challenge posed by reference-qualified types and finish with a practical solution.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/08/13/use-concepts-with-remove_cvref">Use concepts with std::remove_cvref_t</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		By now, it&rsquo;s well known that using unconstrained templates is discouraged. Even the C++ Core Guidelines strongly recommend against it.</p>
	<p>
		<a href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#t47-avoid-highly-visible-unconstrained-templates-with-common-names">T.47</a>&nbsp;only advises avoiding highly visible unconstrained templates with common names due to the risks of argument-dependent lookup going wrong.&nbsp;<a href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#t10-specify-concepts-for-all-template-arguments">T.10</a>&nbsp;goes further, recommending that we specify concepts for every template argument to improve both simplicity and readability.</p>
	<p>
		The same idea appears in&nbsp;<a href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#i9-if-an-interface-is-a-template-document-its-parameters-using-concepts">I.9</a>, which suggests documenting template parameters using concepts.</p>
	<p>
		It&rsquo;s hard to argue with these guidelines. Concepts make code more readable &mdash; just by looking at a function, class, or variable template, the reader can immediately tell what kinds of types are accepted.</p>
	<blockquote>
		<p>
			<em>If you want to learn more about concepts, check out my&nbsp;<a href="https://www.sandordargo.com/tags/concepts/">concepts-related articles</a>&nbsp;or&nbsp;<a href="https://www.sandordargo.com/books/cpp_concepts/">my book on concepts</a>.</em></p>
	</blockquote>
	<p>
		But what makes a good concept? That&rsquo;s a more complex topic &mdash; and one we can&rsquo;t fully cover in a single article.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 23 Sep 2025 22:17:57 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Simple Compile&#45;Time Dynamic Programming in Modern C++ &#45;&#45; Andrew Drakeford</title>
      <link>https://isocpp.org//blog/2025/09/simple-compile-time-dynamic-programming-in-modern-cpp-andrew-drakeford</link>
      <guid>https://isocpp.org//blog/2025/09/simple-compile-time-dynamic-programming-in-modern-cpp-andrew-drakeford</guid>
      <description><![CDATA[<p>
	<img alt="logo.png" src="https://isocpp.org/files/img/logo.png" style="width: 225px; margin: 10px; float: right;" />Compile time code can be very efficient. Andrew Drakeford demonstrates how to write efficient chains of matrix multiplication.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/188/drakeford/">Simple Compile-Time Dynamic Programming in Modern C++</a></h3>
	<p>
		by Andrew Drakeford</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Modern C++ enables us to solve mathematical optimisation problems at compile time. With the expanded constexpr capabilities [<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor002">Fertig21</a>,&nbsp;<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor004">Turner18</a>,&nbsp;<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor005">Turner19</a>,&nbsp;<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor006">Wu24</a>], we can now write clear and efficient optimisation logic that runs during compilation. Fixed-size containers such as&nbsp;<code>std::array</code>&nbsp;fit naturally into these routines. Even standard algorithms, such as&nbsp;<code>std::sort</code>&nbsp;and&nbsp;<code>std::lower_bound</code>, are now constexpr, enabling more straightforward code and more powerful compile-time computations. Additionally, compile-time optimisation generates constant results, which enables the compiler to create even more efficient code. We will use the matrix chain multiplication problem as our worked example.</p>
	<p>
		<strong>Matrix chain multiplication</strong></p>
	<p>
		Matrix chain multiplication is a classic&nbsp;<em>dynamic programming</em>&nbsp;problem [<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor000">Corman22</a>,&nbsp;<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor001">Das19</a>,&nbsp;<a href="https://accu.org/journals/overload/33/188/drakeford/#_idTextAnchor003">Mount</a>]. It aims to determine the most efficient method for multiplying a sequence of matrices. Since matrix multiplication is associative, the order of grouping does not affect the result. However, the number of scalar multiplications involved can vary depending on the grouping.</p>
	<p>
		Consider the three matrices&nbsp;A&#8321;&nbsp;(10&times;100),&nbsp;A&#8322;&nbsp;(100&times;5), and&nbsp;A&#8323;&nbsp;(5&times;50), multiplied in a chain,&nbsp;A&#8321; &times; A&#8322; &times; A&#8323;.</p>
	<p>
		There are two ways to multiply them:</p>
	<ol>
		<li>
			Grouping as (A&#8321; &times; A&#8322;) &times; A&#8323;&nbsp;first computes a 10&times;5 matrix, then multiplies that with&nbsp;A&#8323;. This results in 5,000 operations for the first multiplication, and another 2,500 for the second &ndash; a total of 7,500 scalar multiplications.</li>
		<li>
			Grouping as A&#8321; &times; (A&#8322; &times; A&#8323;)&nbsp;first multiplies&nbsp;A&#8322;&nbsp;and&nbsp;A&#8323;, then&nbsp;A&#8321;. This results in 25,000 operations for the first step and 50,000 for the second &ndash; a total of 75,000, which is clearly worse.</li>
	</ol>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 19 Sep 2025 22:15:15 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26 reflection at compile&#45;time &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/09/cpp26-reflection-at-compile-time-andreas-fertig</link>
      <guid>https://isocpp.org//blog/2025/09/cpp26-reflection-at-compile-time-andreas-fertig</guid>
      <description><![CDATA[<p>
	<img alt="797f4c8c0b89b22b.png" src="https://isocpp.org/files/img/797f4c8c0b89b22b.png" style="width: 150px; margin: 10px; float: right; height: 150px;" />In today&#39;s post, I like to talk about C++26 and one of the probably most impactful features that have been added to the working draft. While C++26 is still some months away from official completion, since the WG21 summer meeting in June we all now know what will be in C++26.</p>
<blockquote>
	<h3>
		<a href="https://andreasfertig.com/blog/2025/08/cpp26-reflection-at-compile-time/">C++26 reflection at compile-time</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		While the new standard will have plenty of great improvements the one that will most likely change a lot is reflection at compile-time! In Sofia we voted seven reflection papers into C++26:</p>
	<ul>
		<li>
			<a href="https://wg21.link/P1306R5" target="_blank">P1306R5</a>&nbsp;<em>Expansion statements</em></li>
		<li>
			<a href="https://wg21.link/P2996R13" target="_blank">P2996R13</a>&nbsp;<em>Reflection for C++26</em></li>
		<li>
			<a href="https://wg21.link/P3096R12" target="_blank">P3096R12</a>:&nbsp;<em>Function parameter reflection in reflection for C++26</em></li>
		<li>
			<a href="https://wg21.link/P3293R3" target="_blank">P3293R3</a>:&nbsp;<em>Splicing a base class subobject</em></li>
		<li>
			<a href="https://wg21.link/P3394R4" target="_blank">P3394R4</a>:&nbsp;<em>Annotations for reflection</em></li>
		<li>
			<a href="https://wg21.link/P3491R3" target="_blank">P3491R3</a>:&nbsp;<em string_object_array="string,object,array">define_static</em>_</li>
		<li>
			<a href="https://wg21.link/P3560R2" target="_blank">P3560R2</a>:&nbsp;<em>Error handling in reflection</em></li>
	</ul>
	<p>
		The papers above should give you enough to read for your vacation. I&#39;ll leave that theoretical study up to you for now.</p>
	<p>
		<strong>Let&#39;s talk practical</strong></p>
	<p>
		The main question is, what can you do with that new feature? Well, I&#39;m not the first one who published their ideas.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 17 Sep 2025 22:10:14 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Format your own type (Part 2) &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/09/format-your-own-type-part-2-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/09/format-your-own-type-part-2-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />Previously, we discussed&nbsp;<a href="https://www.sandordargo.com/blog/2025/07/23/format-your-own-type-part-1">how to write our own formatter</a>&nbsp;and finished with a relatively simple solution for printing a struct called&nbsp;<code>ProgrammingLanguage</code>. Today, we&rsquo;ll take it to the next level.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/07/30/format-your-own-type-part-2">Format your own type (Part 2)</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p id="add-more-options-for-semantic-versioning">
		<strong>Add more options for semantic versioning</strong></p>
	<p>
		Let&rsquo;s dream big. Instead of only handling major and minor versions (like Python 3.12), let&rsquo;s aim to fully support&nbsp;<a href="https://semver.org/">semantic versioning</a>.</p>
	<blockquote>
		<p>
			Semantic versioning (SemVer) is a versioning scheme that conveys meaning about the underlying changes in a release. It typically consists of three parts:&nbsp;<em>MAJOR.MINOR.PATCH</em>.</p>
	</blockquote>
	<p>
		We should be able to print all these correctly:</p>
	<pre class="prettyprint lang-cpp">
ProgrammingLanguage cpp{"C++", 20};&#10;ProgrammingLanguage python312{"Python", 3, 12};&#10;ProgrammingLanguage python31211{"Python", 3, 12, 11};&#10;&#10;&#10;std::cout &lt;&lt; std::format("{:%n%v} is fun", cpp) &lt;&lt; &#39;\n&#39;;&nbsp; // C++20 is fun&#10;std::cout &lt;&lt; std::format("{:%n %v} is fun", python312) &lt;&lt; &#39;\n&#39;;&nbsp; // Python 3.12 is fun&#10;std::cout &lt;&lt; std::format("{:%n %v} is fun", python31211) &lt;&lt; &#39;\n&#39;;&nbsp; // Python 3.12.11 is fun</pre>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Mon, 15 Sep 2025 22:07:32 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Format your own type (Part 1) &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/09/format-your-own-type-part-1-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/09/format-your-own-type-part-1-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />I recently published two posts about how C++26 improves&nbsp;<code>std::format</code>&nbsp;and the related facilities. (If you missed them, here are&nbsp;<a href="https://www.sandordargo.com/blog/2025/07/09/cpp26-format-part-1">Part 1</a>&nbsp;and&nbsp;<a href="https://www.sandordargo.com/blog/2025/07/16/cpp26-format-part-2">Part 2</a>). Now it&rsquo;s time to explore how you can&nbsp;format your own types&nbsp;using&nbsp;<code>std::format</code>.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/07/23/format-your-own-type-part-1">Format your own type (Part 1)</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		<code>std::format</code>&nbsp;was introduced in C++20 and is based on Victor Zverovich&rsquo;s&nbsp;<code>&lt;fmt&gt;</code>&nbsp;library, which in turn was inspired by Python&rsquo;s string formatting capabilities.</p>
	<p>
		Let&rsquo;s skip the fancy formatting options and simply see how to interpolate values using&nbsp;<code>std::format</code>.</p>
</blockquote>
<blockquote>
	<pre class="prettyprint lang-cpp">
<code>#include &lt;format&gt;&#10;#include &lt;iostream&gt;&#10;#include &lt;string&gt;</code>&#10;&#10;<code>int main() &#123;&#10;    std::string language&#123;"C++"&#125;;&#10;    int version&#123;20&#125;;&#10;    std::cout &lt;&lt; std::format("&#123;&#125;&#123;&#125; is fun", language, version) &lt;&lt; &#39;\n&#39;;&#10;&#125;</code>&#10;&#10;<code>/*&#10;C++20 is fun&#10;*/</code></pre>
</blockquote>
<blockquote>
	<p>
		That was easy.</p>
	<p>
		Now imagine you want to print your own type. That won&rsquo;t work by default.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 11 Sep 2025 03:02:43 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>A Library Approach to Constant Template Parameters &#45;&#45; Barry Revzin</title>
      <link>https://isocpp.org//blog/2025/09/a-library-approach-to-constant-template-parameters-barry-revzin</link>
      <guid>https://isocpp.org//blog/2025/09/a-library-approach-to-constant-template-parameters-barry-revzin</guid>
      <description><![CDATA[<p>
	C++26 has brought big advances, especially with reflection making its way into the working draft, but one long-standing challenge remains: supporting richer class types as constant template parameters. Although the language solution isn&rsquo;t here yet, we can get surprisingly far with a library approach that uses reflection and static objects to extend what&rsquo;s possible today.</p>
<blockquote>
	<h3>
		<a href="https://brevzin.github.io/c++/2025/08/02/ctp-reflection/">A Library Approach to Constant Template Parameters</a></h3>
	<p>
		by Barry Revzin</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		This library achieves two things.</p>
	<p>
		First, it is just, in general, very useful. I&rsquo;m hoping to make it more of a Real Library&trade;&#65039; once Reflection gets implemented in more than just the Bloomberg fork of Clang that Dan Katz implemented.</p>
	<p>
		Second, I think it demonstrates the power of Reflection. There are so many problems that were not possible in C++23 that become solvable in C++26. We&rsquo;re going to spend the next several years discovering more of those, and that makes it a pretty exciting time for C++.</p>
</blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 04 Sep 2025 21:56:05 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: std::format improvements (Part 2) &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/09/cpp26-stdformat-improvements-part-2-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/09/cpp26-stdformat-improvements-part-2-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />In&nbsp;<a href="https://www.sandordargo.com/blog/2025/07/09/cpp26-format-part-1">Part 1</a>, we explored the improvements C++26 brings to&nbsp;<code>std::format</code>&nbsp;&mdash; from better&nbsp;<code>to_string</code>&nbsp;behavior to compile-time safety checks. In this part, we look at runtime formatting, defect fixes, and support for new types like&nbsp;<code>std::filesystem::path</code>.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/07/16/cpp26-format-part-2">C++26: std::format improvements (Part 2)</a></h3>
	<p>
		by&nbsp;Sandor Dargo&nbsp;</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p id="runtime-format-strings">
		<strong>Runtime format strings</strong></p>
	<p>
		<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2216r3.html">P2216R3</a>&nbsp;brought quite some improvements to&nbsp;<code>std::format</code>, including compile-time checking for format strings. Sadly, in use cases where format strings were only available at runtime, users had to go with the type-erased formatting version,&nbsp;<a href="https://en.cppreference.com/w/cpp/utility/format/vformat.html">std::vformat</a>:</p>
	<p>
		<code><span style="background-color: rgb(242, 242, 242);">std::vformat(str, std::make_format_args(42));</span></code></p>
	<p>
		Using two different APIs is not a great user experience, moreover,&nbsp;<code>std::vformat</code>&nbsp;was designed to be used by formatting function writers and not by end users. In addition, you might run into undefined behaviour, detailed in the next section.</p>
	<p>
		To overcome this situation,&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2918r2.html">P2918R2</a>&nbsp;adds&nbsp;<a href="https://en.cppreference.com/w/cpp/utility/format/runtime_format.html"><code>std::runtime_format</code></a>&nbsp;so you can mark format strings that are only available at run-time. As such you can opt out of compile-time format strings checks. This makes the API cleaner and the user code will read better as it shows better the intentions.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 02 Sep 2025 21:55:00 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: std::format improvement (Part 1) &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/08/cpp26-stdformat-improvement-part-1-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/08/cpp26-stdformat-improvement-part-1-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 150px; margin: 10px; float: right; height: 153px;" />C++26 brings a series of improvements to&nbsp;<code>std::format</code>, continuing the work started in C++20 and refined in C++23. These changes improve formatting consistency, runtime safety, and user ergonomics. There are so many of these updates, that I decided to divide them into two articles.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/07/09/cpp26-format-part-1">C++26: std::format improvement (Part 1)</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p id="arithmetic-overloads-of-stdto_string-and-stdto_wstring-use-stdformat">
		<strong>Arithmetic overloads of&nbsp;<code>std::to_string</code>&nbsp;and&nbsp;<code>std::to_wstring</code>&nbsp;use&nbsp;<code>std::format</code></strong></p>
	<p>
		<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2587r3.html">P2587R3</a>&nbsp;by Victor Zverovich proposes replacing&nbsp;<code>sprintf</code>&nbsp;with&nbsp;<code>std::format</code>&nbsp;in the arithmetic overloads of&nbsp;<code>std::to_string</code>&nbsp;and&nbsp;<code>std::to_wstring</code>.</p>
	<p>
		The motivation?</p>
	<p>
		<code>std::to_string</code>&nbsp;has long been known to produce not-so-great and misleading results (differing from&nbsp;<code>iostreams</code>), especially with floating-point values.&nbsp;<code>std::to_string</code>&nbsp;uses the global C locale. In practice, it&rsquo;s unlocalized. Also, it often places the decimal points to suboptimal places:</p>
	<pre class="prettyprint lang-cpp">
<code><span courier="" lucida="" style="font-family: Consolas, ">std::cout &lt;&lt; std::to_string(-1e-7); // prints: -0.000000 &#10;std::cout &lt;&lt; std::to_string(0.42); // prints: 0.420000</span></code></pre>
	<div>
		<div style="clear:both;">
			These outputs are imprecise and often unnecessary. By leveraging&nbsp;<code>std::format</code>&nbsp;(and ultimately&nbsp;<code>std::to_chars</code>), we now get clearer, shorter representations. The representations of floating-point overloads become also unlocalized and use the shortest decimal representations.</div>
	</div>
	<p>
		As a result, the above outputs would change as follow:</p>
</blockquote>
<pre class="prettyprint lang-cpp">
<code>    std::cout &lt;&lt; std::to_string(-1e-7);  // prints: -1e-7&#10;    std::cout &lt;&lt; std::to_string(0.42); // prints: 0.42</code></pre>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 29 Aug 2025 21:55:35 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Boost version 1.89 released!</title>
      <link>https://isocpp.org//blog/2025/08/boost-version-1.89-released</link>
      <guid>https://isocpp.org//blog/2025/08/boost-version-1.89-released</guid>
      <description><![CDATA[<p>
	<a href="https://www.boost.org/releases/1.89.0/"><img alt="space.png" src="https://isocpp.org/files/img/space.png" style="width: 2px; margin: 10px; float: right;" /><img alt="space.png" src="https://isocpp.org/files/img/space.png" style="width: 2px; margin: 10px; float: right;" /><img alt="getboost.png" src="https://isocpp.org/files/img/getboost.png" style="width: 147px; margin: 10px; float: right;" />Release 1.89 of the Boost C++ Libraries is now available.</a></p>
<p>
	One new library and updates to 28 more.</p>
<p>
	Bloom, configurable filters for probabilistic lookup: <a href="https://boost.org/libs/bloom">https://boost.org/libs/bloom</a></p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 27 Aug 2025 21:51:14 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Once More About dynamic_cast, a Real Use Case &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/08/once-more-about-dynamic-cast-a-real-use-case-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/08/once-more-about-dynamic-cast-a-real-use-case-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 204px;" />While <code data-end="66" data-start="52">dynamic_cast</code> is often discouraged for its impact on readability and reliance on RTTI, there are rare situations where it can be the most practical and safe solution. In this post, we explore one such real-world case: using <code data-end="291" data-start="277">dynamic_cast</code> for runtime versioning of plugin interfaces in a way that balances compatibility, safety, and extensibility.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/06/25/once-more-about-dynamic-casts">Once More About dynamic_cast, a Real Use Case</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		I wrote a couple of times about&nbsp;<code>dynamic_cast</code>&nbsp;and I discouraged you from using it. In general,&nbsp;<a href="https://www.sandordargo.com/blog/2023/04/26/without-rtti-your-code-will-be-cleaner">it makes code worse in terms of readability</a>. When you get rid of&nbsp;<code>dynamic_cast</code>, either via self-discipline or by&nbsp;<a href="https://www.sandordargo.com/blog/2023/03/01/binary-sizes-and-rtti">turning RTTI off</a>, you&rsquo;ll have to rely on dynamic dispatching and better abstractions.</p>
	<p>
		But there might be cases, when it&rsquo;s not possible or at least it&rsquo;s not meaningful to remove&nbsp;<code>dynamic_cast</code>, here is one, sent by one of you.</p>
	<p id="versioning-with-the-help-of-dynamic_cast">
		<strong>Versioning with the help of&nbsp;<code>dynamic_cast</code></strong></p>
	<p>
		They have an SDK that anyone can implement. As there are new features added every now and then, the API keeps changing. Not surprisingly, the owners of the SDK want to prevent their users&rsquo; code from breaking. They achieve this by having different &ldquo;versioned&rdquo; interfaces for the same service where a new version inherits from the previous one.</p>
	<p>
		Let&rsquo;s see a simplified example.</p>
	<img alt="" src="data:image/png;base64,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" /></blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 21 Aug 2025 15:14:18 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Trip report: C++ On Sea 2025 &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/08/trip-report-cpp-on-sea-2025-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/08/trip-report-cpp-on-sea-2025-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="cpponsea2025-folkestone-to-dover.jpg" src="https://isocpp.org/files/img/cpponsea2025-folkestone-to-dover.jpg" style="width: 201px; margin: 10px; float: right; height: 113px;" />Another year, another trip report from C++ On Sea!</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/07/02/cpponsea-trip-report">Trip report: C++ On Sea 2025</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		First, a heartfelt thank-you to the organizers for inviting me to speak, and an equally big thank-you to my wife for taking care of the kids while I spent three days in Folkestone &mdash; plus a few more in London to visit the Spotify office and catch up with some bandmates.</p>
	<p>
		<em>If you have the chance, try to arrive early or stay around Folkestone for an extra day. It&rsquo;s a lovely town and it&rsquo;s worth exploring it. The conference program is very busy even in the evenings, so don&rsquo;t count on the after hours.</em></p>
	<p>
		<em>This year, I arrived an half a day in advance and I had a wonderful hike from Folkestone to Dover. It was totally worth it.</em></p>
	<p>
		In this post I&rsquo;ll share:</p>
	<ul>
		<li>
			Thoughts on the conference experience.</li>
		<li>
			Highlights from talks and ideas that resonated with me.</li>
		<li>
			Personal impressions, including reflections on my own sessions &mdash; both the main talk and the lightning talk.</li>
	</ul>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 19 Aug 2025 14:11:51 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>A virtual destructor in C++, when? &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/08/a-virtual-destructor-in-cpp-when-andreas-fertig</link>
      <guid>https://isocpp.org//blog/2025/08/a-virtual-destructor-in-cpp-when-andreas-fertig</guid>
      <description><![CDATA[<p>
	<img alt="2025-07-01-when-to-not-use-a-virtual-dtor-tw.png" src="https://isocpp.org/files/img/2025-07-01-when-to-not-use-a-virtual-dtor-tw.png" style="width: 201px; margin: 10px; float: right; height: 113px;" />When should a destructor be virtual in C++? In this post, we&rsquo;ll explore a real-world example from smart pointer implementation to illustrate when virtual destructors are necessary &mdash; and when they&rsquo;re not.</p>
<blockquote>
	<h3>
		<a href="https://andreasfertig.com/blog/2025/07/a-virtual-destructor-in-cpp-when/">A virtual destructor in C++, when?</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		In today&#39;s post, I would like to explain a design rationale used in my post&nbsp;<a href="https://andreasfertig.com/blog/2024/09/understanding-the-inner-workings-of-cpp-smart-pointers-the-shared_ptr/">Understanding the inner workings of C++ smart pointers - The shared_ptr</a>.</p>
	<p>
		Keen readers spotted that in my implementation of&nbsp;<code>ctrl_blk_base</code>, I didn&#39;t make the destructor&nbsp;<code>virtual</code>. Here is the original code for easy reference:</p>
	<img alt="" src="data:image/png;base64,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" />
	<pre>
&#10;</pre>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 15 Aug 2025 15:05:43 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Reflecting JSON into C++ Objects &#45;&#45; Barry Revzin</title>
      <link>https://isocpp.org//blog/2025/08/reflecting-json-into-cpp-objects-barry-revzin</link>
      <guid>https://isocpp.org//blog/2025/08/reflecting-json-into-cpp-objects-barry-revzin</guid>
      <description><![CDATA[<p>
	C++26 marks a transformative milestone with the adoption of full compile-time reflection, enabling powerful new metaprogramming capabilities. In this post, we&rsquo;ll explore how reflection lets you turn a JSON file directly into a fully-typed C++ object &mdash; all at compile time.</p>
<blockquote>
	<h3>
		<a href="https://brevzin.github.io/c++/2025/06/26/json-reflection/">Reflecting JSON into C++ Objects</a></h3>
	<p>
		by&nbsp;Barry Revzin</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Last week, C++26 was finalized in Sofia, Bulgaria &mdash;&nbsp;and C++26 will include all of the reflection papers that we were pushing for:</p>
	<ol>
		<li>
			<a href="https://isocpp.org/files/papers/P2996R13.html">P2996R13</a>: Reflection for C++26</li>
		<li>
			<a href="https://isocpp.org/files/papers/P3394R4.html">P3394R4</a>: Annotations for Reflection</li>
		<li>
			<a href="https://isocpp.org/files/papers/P3293R3.html">P3293R3</a>: Splicing a Base Class Subobject</li>
		<li>
			<a href="https://isocpp.org/files/papers/P3491R3.html">P3491R3</a>:&nbsp;<code>define_static_&#123;string,object,array&#125;</code></li>
		<li>
			<a href="https://isocpp.org/files/papers/P1306R5.html">P1306R5</a>: Expansion Statements</li>
		<li>
			<a href="https://isocpp.org/files/papers/P3096R12.pdf">P3096R12</a>: Function Parameter Reflection in Reflection for C++26</li>
		<li>
			<a href="https://isocpp.org/files/papers/P3560R2.html">P3560R2</a>: Error Handling in Reflection</li>
	</ol>
	<p>
		Those are in the order in which they were adopted, not in the order of their impact (otherwise splicing base classes would go last). This is a pretty incredible achievement that couldn&rsquo;t have happened without lots of people&rsquo;s work, but no one person is more responsible for Reflection in C++26 than Dan Katz.</p>
	<p>
		So today I wanted to talk about a very cool example that Dan put together on the flight home from Sofia, while I was unconscious a few seats over: the ability to, at compile time, ingest a JSON file and turn it into a C++ object. That is, given a file&nbsp;<code>test.json</code>&nbsp;that looks like this:</p>
	<pre>
<code>&#123; "outer": "text", &#10;"inner": &#123; "field": "yes", "number": 2996 &#125; &#10;&#125; </code></pre>
	<p>
		We can write this:</p>
	<pre>
<code>constexpr const char data[] = &#123; &#10;     #embed "test.json" &#10;     , 0 &#10;&#10;&#125;; constexpr auto v = json_to_object&lt;data&gt;;</code></pre>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 13 Aug 2025 16:00:45 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Discover C++26’s Compile&#45;Time Reflection &#45;&#45; Daniel Lemire</title>
      <link>https://isocpp.org//blog/2025/08/discover-cpp26s-compile-time-reflection-daniel-lemire</link>
      <guid>https://isocpp.org//blog/2025/08/discover-cpp26s-compile-time-reflection-daniel-lemire</guid>
      <description><![CDATA[<p>
	<img alt="Capture-decran-le-2025-06-21-a-21.55.10-825x510.png" src="https://isocpp.org/files/img/Capture-decran-le-2025-06-21-a-21.55.10-825x510.png" style="width: 200px; margin: 10px; float: right; height: 124px;" />C++26 is bringing a long-awaited feature to the language: compile-time reflection, enabling programs to introspect and manipulate their own structure during compilation. This powerful capability opens the door to eliminating boilerplate, improving performance, and writing more expressive, reusable code with ease.</p>
<blockquote>
	<h3>
		<a href="https://lemire.me/blog/2025/06/22/c26-will-include-compile-time-reflection-why-should-you-care/">Discover C++26&rsquo;s Compile-Time Reflection</a></h3>
	<p>
		by Daniel Lemire</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Herb Sutter just announced that the verdict is in: C++26, the next version of C++, will include compile-time reflection.</p>
	<p>
		Reflection in programming languages means that you have access the code&rsquo;s own structure. For example, you can take a class, and enumerate its methods. For example, you could receive a class, check whether it contains a method that returns a string, call this method and get the string. Most programming languages have some form of reflection. For example, the good old Java does have complete reflection support.</p>
	<p>
		However, C++ is getting compile-time reflection. It is an important development.</p>
	<p>
		I announced a few months ago that thanks to joint work with Francisco Geiman Thiesen, the performance-oriented JSON library simdjson would support compile-time reflection as soon as mainstream compilers support it.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 09 Aug 2025 16:54:09 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Variadic Class Template Arguments &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/08/variadic-class-template-arguments-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/08/variadic-class-template-arguments-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 200px;" />Variadic templates are a powerful C++ feature that allow template classes or functions to accept an arbitrary number of parameters. In this article, we&rsquo;ll explore how to combine them with class templates and examine the various ways the parameter pack can be expanded.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/06/18/variadic-inheritance">Variadic Class Template Arguments</a></h3>
	<p>
		by&nbsp;Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Let&rsquo;s talk about class templates and variadic parameters. How to use them in combination?</p>
	<p>
		But first of all, what are variadic templates?</p>
	<p>
		Variadic template don&rsquo;t accept a fixed size of parameters, but anything from one to more. The set of parameters is called the parameter pack.</p>
	<p>
		In the template parameter list, we can see the three dots (<code>...</code>) signaling the pack after the&nbsp;<code>typename</code>&nbsp;or&nbsp;<code>class</code>&nbsp;keywords, or after the constraints. Then later in the function / constructor parameter list, you can observe it right after the actual type name, and finally once the pack is expanded, it comes after the packed variable name.</p>
	<p>
		Variadic arguments can be used in so many different ways both with function and class templates. Today, we are focusing on class templates.</p>
	<p>
		When you are using variadic templates with class templates, the expansion can happen at different places. You might expand the parameter pack</p>
	<ul>
		<li>
			within the constructor or any other member function</li>
		<li>
			when declaring a member variable</li>
		<li>
			at the inheritance list</li>
		<li>
			in a using declaration</li>
		<li>
			in friend declarations</li>
	</ul>
	<h2 id="expansion-in-the-constructor-and-in-variable-declaration">
		&nbsp;</h2>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 05 Aug 2025 15:50:40 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: Disallow Binding a Returned Reference to a Temporary &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/07/cpp26-disallow-binding-a-returned-reference-to-a-temporary-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/07/cpp26-disallow-binding-a-returned-reference-to-a-temporary-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 250px; margin: 10px; float: right;" />This change in C++26 tightens the rules around returning references to temporaries &mdash; and that&rsquo;s a good thing. It turns dangerous, bug-prone code into immediate compilation errors, making code safer and easier to reason about. It also reflects a broader trend in modern C++: giving programmers stronger guarantees and better diagnostics, even at the cost of breaking some old patterns.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/06/11/cpp26-no-binding-to-returned-reference-to-temporary">C++26: Disallow Binding a Returned Reference to a Temporary</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		In short, thanks to&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2748r5.html">P2748R5</a>&nbsp;by Brian Bi, it&rsquo;s no longer possible to return a reference that binds to a temporary expression, and that&rsquo;s just lovely.</p>
	<p id="what-exactly-is-changing">
		<strong>What exactly is changing?</strong></p>
	<p>
		Often, a proposal modifies a lot of wording, and it&rsquo;s not practical to start by reading through it all. But in this case, the changes are small and easy to digest, so let&rsquo;s dive in.</p>
	<p>
		This line is being&nbsp;removed:</p>
	<blockquote>
		<p>
			<em>&ldquo;The lifetime of a temporary bound to the returned value in a function return statement (8.7.4) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.&rdquo;</em></p>
	</blockquote>
	<p>
		And this line is being&nbsp;added&nbsp;(excluding the examples we&rsquo;ll discuss in a moment):</p>
	<blockquote>
		<p>
			<em>&ldquo;In a function whose return type is a reference, other than an invented function for&nbsp;<code>std::is_convertible</code>&nbsp;([meta.rel]), a return statement that binds the returned reference to a temporary expression ([class.temporary]) is ill-formed.&rdquo;</em></p>
	</blockquote>
	<p>
		There are two interesting shifts here:</p>
	<ul>
		<li>
			The language becomes more specific. It doesn&rsquo;t merely mention &ldquo;temporaries&rdquo; but refers directly to&nbsp;references binding to temporary expressions, with certain exceptions.</li>
		<li>
			The effect isn&rsquo;t just that lifetime extension doesn&rsquo;t happen, it&rsquo;s now a&nbsp;compilation error. The code is ill-formed.</li>
	</ul>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 25 Jul 2025 21:58:23 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>constexpr Functions: Optimization vs Guarantee &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/07/constexpr-functions-optimization-vs-guarantee-andreas-fertig1</link>
      <guid>https://isocpp.org//blog/2025/07/constexpr-functions-optimization-vs-guarantee-andreas-fertig1</guid>
      <description><![CDATA[<p>
	<img alt="me.png" src="https://isocpp.org/files/img/me.png" style="width: 250px; margin: 10px; float: right;" />Constexpr has been around for a while now, but many don&rsquo;t fully understand its subtleties. Andreas Fertig explores its use and when a constexpr expression might not be evaluated at compile time.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/fertig/">constexpr Functions: Optimization vs Guarantee</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		The feature of constant evaluation is nothing new in 2023. You have constexpr available since C++11. Yet, in many of my classes, I see that people still struggle with&nbsp;<code>constexpr</code>&nbsp;functions. Let me shed some light on them.</p>
	<p>
		<strong>What you get is not what you see</strong></p>
	<p>
		One thing, which is a feature, is that&nbsp;<code>constexpr</code>&nbsp;functions can be evaluated at compile-time, but they can run at run-time as well. That evaluation at compile-time requires all values known at compile-time is reasonable. But I often see that the assumption is once all values for a&nbsp;<code>constexpr</code>&nbsp;function are known at compile-time, the function will be evaluated at compile-time.</p>
	<p>
		I can say that I find this assumption reasonable, and discovering the truth isn&rsquo;t easy. Let&rsquo;s consider an example (Listing 1).</p>
	<pre>
constexpr auto Fun(int v)&#10;{&#10;  return 42 / v; &#9312;&#10;}&#10;&#10;int main()&#10;{&#10;  const auto f = Fun(6); &#9313;&#10;  return f;              &#9314;&#10;}</pre>
	The&nbsp;<code>constexpr</code>&nbsp;function&nbsp;<code>Fun</code>&nbsp;divides 42 by a value provided by the parameter&nbsp;<code>v</code>&nbsp;&#9312;. In&nbsp;&#9313;, I call&nbsp;<code>Fun</code>&nbsp;with the value&nbsp;<code>6</code>&nbsp;and assign the result to the variable&nbsp;<code>f</code>.</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 23 Jul 2025 21:54:53 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Three types of name lookups in C++ &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/07/three-types-of-name-lookups-in-cpp-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/07/three-types-of-name-lookups-in-cpp-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 250px; margin: 10px; float: right;" />Let&#39;s revisit a core concept in C++: how the compiler finds the names you use in your code. From qualified and unqualified name lookups to the special case of Argument-Dependent Lookup (ADL), understanding these mechanisms is essential for writing clear and correct C++ programs.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/05/28/three-ways-of-name-lookups">Three types of name lookups in C++</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Let&rsquo;s get back to some basics this week and talk about name lookups in C++. In other words: when you refer to a symbol in your code, how does the compiler find it?</p>
	<p>
		Essentially, we can differentiate between three kinds of lookups:</p>
	<ul>
		<li>
			Qualified name lookup</li>
		<li>
			Unqualified name lookup</li>
		<li>
			Argument-Dependent Lookup (ADL)</li>
	</ul>
	<p>
		Let&rsquo;s explore them in that order.</p>
	<p id="qualified-name-lookup">
		<strong>Qualified Name Lookup</strong></p>
	<p>
		The term&nbsp;<em>qualified</em>&nbsp;refers to symbols that are explicitly scoped using the&nbsp;<code>::</code>&nbsp;operator. In other words, these are names that appear to the right of a&nbsp;<code>::</code>, such as&nbsp;<code>x</code>&nbsp;in&nbsp;<code>a::b::x</code>.</p>
	<p>
		Before the compiler can perform a qualified name lookup, it must first resolve the left-hand side of the&nbsp;<code>::</code>&nbsp;operator. This identifies the namespace or class being referenced.</p>
	<p>
		Qualified name lookup is relatively simple: it only searches the explicitly named scope. It&nbsp;does not&nbsp;search enclosing or outer scopes.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Mon, 21 Jul 2025 21:51:07 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Why does C++ think my class is copy&#45;constructible when it can’t be copy&#45;constructed? &#45;&#45; Raymond Chen</title>
      <link>https://isocpp.org//blog/2025/07/why-does-cpp-think-my-class-is-copy-constructible-when-it-cant-be-copy-cons</link>
      <guid>https://isocpp.org//blog/2025/07/why-does-cpp-think-my-class-is-copy-constructible-when-it-cant-be-copy-cons</guid>
      <description><![CDATA[<p>
	<img alt="RaymondChen_5in-150x150.jpg" src="https://isocpp.org/files/img/RaymondChen_5in-150x150.jpg" style="width: 150px; margin: 10px; float: right;" />In C++, the presence of a user-declared (but not explicitly deleted) copy constructor is enough for the type to be considered copy-constructible by traits like <code data-end="188" data-start="160">std::is_copy_constructible</code>. However, whether that constructor is <em data-end="241" data-start="227">instantiable</em> is a separate matter&mdash;if it attempts to call a deleted base copy constructor, you&#39;ll still get a compile-time error when you actually try to use it.</p>
<blockquote>
	<h3>
		<a href="https://devblogs.microsoft.com/oldnewthing/20250606-00/?p=111254">Why does C++ think my class is copy-constructible when it can&rsquo;t be copy-constructed?</a></h3>
	<p>
		by Raymond Chen</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Consider the following scenario:</p>
	<p>
		template&lt;typename T&gt;<br />
		struct Base<br />
		{<br />
		&nbsp;&nbsp;&nbsp; // Default-constructible<br />
		&nbsp;&nbsp;&nbsp; Base() = default;</p>
	<p>
		&nbsp;&nbsp;&nbsp; // Not copy-constructible<br />
		&nbsp;&nbsp;&nbsp; Base(Base const &amp;) = delete;<br />
		};</p>
	<p>
		template&lt;typename T&gt;<br />
		struct Derived : Base&lt;T&gt;<br />
		{<br />
		&nbsp;&nbsp;&nbsp; Derived() = default;<br />
		&nbsp;&nbsp;&nbsp; Derived(Derived const&amp; d) : Base&lt;T&gt;(d) {}<br />
		};</p>
	<p>
		// This assertion passes?<br />
		static_assert(<br />
		&nbsp;&nbsp;&nbsp; std::is_copy_constructible_v&lt;Derived&lt;int&gt;&gt;);<br />
		<br />
		Why does this assertion pass? It is plainly evident that you cannot copy a Derived&lt;int&gt; because doing so will try to copy the Base&lt;int&gt;, which is not copyable.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 17 Jul 2025 21:48:04 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Returning several values from a function in C++ (C++23 edition) &#45;&#45; Daniel Lemire</title>
      <link>https://isocpp.org//blog/2025/07/returning-several-values-from-a-function-in-cpp-c23-edition-daniel-lemire</link>
      <guid>https://isocpp.org//blog/2025/07/returning-several-values-from-a-function-in-cpp-c23-edition-daniel-lemire</guid>
      <description><![CDATA[<p>
	<img alt="RkWx2Fr8_400x400.jpg" src="https://isocpp.org/files/img/RkWx2Fr8_400x400.jpg" style="width: 250px; margin: 10px; float: right; height: 250px;" />While C++ doesn&rsquo;t have native syntax for returning multiple values like some other languages, modern C++ offers powerful tools to accomplish the same goal. With features like <code data-end="187" data-start="175">std::tuple</code>, structured bindings, <code data-end="225" data-start="210">std::expected</code>, and <code data-end="246" data-start="231">std::optional</code>, handling multiple return values&mdash;and even error codes&mdash;has become both clean and expressive.</p>
<blockquote>
	<h3>
		<a href="https://lemire.me/blog/2025/05/18/returning-several-values-from-a-function-in-c-c23-edition/">Returning several values from a function in C++ (C++23 edition)</a></h3>
	<p>
		by Daniel Lemire</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Many programming languages such as the Go programming language are designed to make it easy to return several values at once from a function. In Go, it is often used to return an optional error code. The C++ programming language does not have a built-in support for returning several values. However, several standard types can serve the same purpose. If you need to return two values, you can use an std::pair instance. If you need to return two or more values, an std::tuple instance will do. With recent C++ standards, it works really well!</p>
	<p>
		Suppose we want to compute a division with a string error message when one is trying to divided by zero:</p>
	<pre>
std::tuple&lt;int,std::string&gt; divide(int a, int b) {&#10; if (b == 0) {&#10; return {0, "Error: Division by zero"};&#10; }&#10; return {a / b, "Success"};&#10;}&#10;</pre>
	<p>
		This approach works nicely. The code is clear and readable.</p>
	<p>
		You might be concerned that we are fixing the type (int). If you want to write one function for all integer types, you can do so with concepts, like so:</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 15 Jul 2025 21:44:07 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Constructing Containers from Ranges in C++23 &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/07/constructing-containers-from-ranges-in-cpp23-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/07/constructing-containers-from-ranges-in-cpp23-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 250px; margin: 10px; float: right; height: 250px;" />Starting from C++23, standard containers support a new set of constructor overloads. These constructors take a&nbsp;<code>std::from_range</code>&nbsp;tag, a range and an optional allocator. These&nbsp;<code>from_range</code>&nbsp;constructors make it easier to construct containers from ranges, helping make C++ code more concise, more expressive, and less error-prone.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/05/21/cpp23-from-range-constructors">Constructing Containers from Ranges in C++23</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		I&rsquo;ve written plenty on this blog about&nbsp;<a href="https://www.sandordargo.com/tags/algorithms/">standard algorithms</a>, but far less about&nbsp;<a href="https://www.sandordargo.com/tags/ranges/">ranges</a>. That&rsquo;s mostly because, although I&rsquo;ve had production-ready compilers with C++20 ranges since late 2021, the original ranges library lacked a few key capabilities.</p>
	<p>
		The biggest gap was at the&nbsp;<em>end</em>&nbsp;of a pipeline: you could transform data lazily, but you&nbsp;<em>couldn&rsquo;t</em>&nbsp;drop the result straight into a brand-new container. What you got back was a&nbsp;view; turning that view into, say, a&nbsp;<code>std::vector</code>&nbsp;still required the old iterator-pair constructor.</p>
	<p>
		C++23 fixes that in two complementary ways:</p>
	<ul>
		<li>
			<code>std::to</code>&nbsp;(an adaptor that finishes a pipeline by&nbsp;converting to a container), and</li>
		<li>
			<code>from_range</code>&nbsp;constructors&nbsp;on every standard container.</li>
	</ul>
	<p>
		Today we&rsquo;ll focus on the second improvement, because it&rsquo;s the one you can implement in your own types, too.</p>
	<p id="the-from_range-constructor">
		<strong>The&nbsp;<code>from_range</code>&nbsp;constructor</strong></p>
	<p>
		Every standard container now supports a new set of constructors that make integration with ranges smoother &mdash; the so-called&nbsp;<code>from_range</code>&nbsp;constructors.</p>
	<p>
		These constructors allow you to build a container directly from a range, rather than from a pair of iterators.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 11 Jul 2025 21:38:53 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++ Insights now uses Clang 20 &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/07/cpp-insights-now-uses-clang-20-andreas-fertig</link>
      <guid>https://isocpp.org//blog/2025/07/cpp-insights-now-uses-clang-20-andreas-fertig</guid>
      <description><![CDATA[<p>
	<img alt="me.png" src="https://isocpp.org/files/img/me.png" style="width: 250px; margin: 10px; float: right;" />Time flies&mdash;C++ Insights just turned 7! To celebrate, I&rsquo;ve upgraded the tool to Clang 20, unlocking even more C++23 and C++26 features for you to explore.</p>
<blockquote>
	<h3>
		<a href="https://andreasfertig.com/blog/2025/05/cpp-insights-now-uses-clang-20/">C++ Insights now uses Clang 20</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		<strong><code>size_t</code></strong></p>
	<p>
		For a long time now, when you used&nbsp;<code>size_t</code>&nbsp;or&nbsp;<code>std::size_t</code>&nbsp;the resulting transformation kept the name. It did not expand to the underlying machine-specific date type. To be honest, that was more like a happy accident. Clang 20 came with two changes to libc++</p>
	<p>
		The first&nbsp;<a href="https://github.com/llvm/llvm-project/commit/d6832a611a7c4ec36f08b1cfe9af850dad32da2e" target="_blank">https://github.com/llvm/llvm-project/commit/d6832a611a7c4ec36f08b1cfe9af850dad32da2e</a>&nbsp;modularized&nbsp;<code>&lt;cstddef&gt;</code>&nbsp;for better internal structuring, avoiding too much content to be included. This patch was followed by a second one:&nbsp;<a href="https://github.com/llvm/llvm-project/commit/5acc4a3dc0e2145d2bfef47f1543bb291c2b866a" target="_blank">https://github.com/llvm/llvm-project/commit/5acc4a3dc0e2145d2bfef47f1543bb291c2b866a</a>. This one now made an interesting change.</p>
	<p>
		Previously, libc++ defined&nbsp;<code>std::size_t</code>&nbsp;as</p>
	<table style="width:858px;">
		<tbody>
			<tr>
				<td style="width:30px;">
					<div>
						<pre>
1</pre>
					</div>
				</td>
				<td style="width:827px;">
					<div>
						<pre>
<code>using ::size_t _LIBCPP_USING_IF_EXISTS; </code></pre>
					</div>
				</td>
			</tr>
		</tbody>
	</table>
	<p>
		As the second patch highlighted, this required including the operating systems&nbsp;<code>&lt;stddef.h&gt;</code>. In the spirit of reducing unnecessary includes the line was changed to:</p>
	<table style="width:858px;">
		<tbody>
			<tr>
				<td style="width:30px;">
					<div>
						<pre>
1</pre>
					</div>
				</td>
				<td style="width:827px;">
					<div>
						<pre>
<code>using size_t = decltype(sizeof(int)); </code></pre>
					</div>
				</td>
			</tr>
		</tbody>
	</table>
	<p>
		This is an easy C++ solution to get the proper data type for&nbsp;<code>size_t</code>. Which is great. Yet, the AST nodes of the two versions look different. Previously, the operating system (macOS in this case) defined in its header:</p>
	<table style="width:858px;">
		<tbody>
			<tr>
				<td style="width:30px;">
					<div>
						<pre>
1</pre>
					</div>
				</td>
				<td style="width:827px;">
					<div>
						<pre>
<code>typedef unsigned long size_t; </code></pre>
					</div>
				</td>
			</tr>
		</tbody>
	</table>
	<p>
		Well, with the new version, the transformation no longer stops at&nbsp;<code>size_t</code>&nbsp;but expands it all down to&nbsp;<code>unsigned long</code>. This probably should have been the case from the beginning, but I liked that tests and transformations did not change across platforms in this specific case. However, there are other instances where the transformation did yield different output on different platforms, so I accept this one.</p>
	<h3>
		&nbsp;</h3>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 09 Jul 2025 21:35:32 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>What’s New for C++ Developers in Visual Studio 2022 17.14 &#45;&#45; Sy Brand</title>
      <link>https://isocpp.org//blog/2025/07/whats-new-for-cpp-developers-in-visual-studio-2022-17.14-sy-brand</link>
      <guid>https://isocpp.org//blog/2025/07/whats-new-for-cpp-developers-in-visual-studio-2022-17.14-sy-brand</guid>
      <description><![CDATA[<p>
	<img alt="RE1Mu3b.png" src="https://isocpp.org/files/img/RE1Mu3b.png" style="width: 216px; margin: 10px; float: right;" />Visual Studio 2022 version 17.14 is now generally available! This post summarizes the new features you can find in this release for C++. You can download Visual Studio 2022 from the&nbsp;<a href="https://visualstudio.microsoft.com/downloads/" rel="noopener" target="_blank">Visual Studio downloads page&nbsp;</a>or upgrade your existing installation by following the&nbsp;<a href="https://learn.microsoft.com/en-us/visualstudio/install/update-visual-studio?view=vs-2022" rel="noopener" target="_blank">Update Visual Studio Learn page</a>.</p>
<blockquote>
	<h3>
		<a href="https://devblogs.microsoft.com/cppblog/whats-new-for-cpp-developers-in-visual-studio-2022-17-14/">What&rsquo;s New for C++ Developers in Visual Studio 2022 17.14</a></h3>
	<p>
		by Sy Brand</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		We&rsquo;ve made a myriad of fixes and improvements to the MSVC compiler and standard library. See&nbsp;<a href="https://devblogs.microsoft.com/cppblog/c-language-updates-in-msvc-in-visual-studio-2022-17-14/">C++ Language Updates in MSVC in Visual Studio 2022 17.14&nbsp;</a>for a full list of changes on the compiler side, and the&nbsp;<a href="https://github.com/microsoft/STL/wiki/Changelog" target="_blank">STL Changelog</a>&nbsp;for all the standard library updates.</p>
	<p id="compiler">
		<strong>Compiler</strong></p>
	<p>
		We&rsquo;ve added support for several C++23 features, which are available under the&nbsp;<code>/std:c++latest</code>&nbsp;and&nbsp;<code>/std:c++23preview</code>&nbsp;flags.</p>
	<p>
		You can now omit&nbsp;<code>()</code>&nbsp;in some forms of lambdas that previously required them, thanks to&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1102r2.html" rel="noopener" target="_blank">P1102R2</a>:</p>
	auto lambda = [] constexpr { }; //no &#39;()&#39; needed after the capture list</blockquote>
<blockquote>
	We implemented&nbsp;<code><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1938r3.html" target="_blank">if consteval</a></code>, with which you can run different code depending on whether the statement is executed at compile time or run time. This is useful for cases where your run time version can be heavily optimized with compiler intrinsics or inline assembly that are not available at compile time:</blockquote>
<blockquote>
	constexpr size_t strlen(char const* s) {<br />
	&nbsp;&nbsp;&nbsp; if consteval {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if executed at compile time, use a constexpr-friendly algorithm<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (const char *p = s; ; ++p) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*p == &#39;\0&#39;) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return static_cast&lt;std::size_t&gt;(p - s);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp; } else {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if executed at run time, use inline assembly<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __asm__("SSE 4.2 magic");<br />
	&nbsp;&nbsp;&nbsp; }<br />
	}</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Mon, 07 Jul 2025 21:32:18 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: Erroneous Behaviour &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/07/cpp26-erroneous-behaviour-sandor-dargo2</link>
      <guid>https://isocpp.org//blog/2025/07/cpp26-erroneous-behaviour-sandor-dargo2</guid>
      <description><![CDATA[<p>
	<img alt="logo.png" src="https://isocpp.org/files/img/logo.png" style="width: 225px; margin: 10px; float: right;" />C++&rsquo;s undefined behaviour impacts safety. Sandor Dargo explains how and why uninitialised reads will become erroneous behaviour in C++26, rather than being undefined behaviour.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/dargo/">C++26: Erroneous Behaviour</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		If you pick a random talk at a C++ conference these days, there is a fair chance that the speaker will mention safety at least a couple of times. It&rsquo;s probably fine like that. The committee and the community must think about improving both the safety situation and the reputation of C++.</p>
	<p>
		If you follow what&rsquo;s going on in this space, you are probably aware that people have different perspectives on safety. I think almost everybody finds it important, but they would solve the problem in their own way.</p>
	<p>
		A big source of issues is certain manifestations of undefined behaviour. It affects both the safety and the stability of software. I remember that a few years ago when I was working on some services which had to support a 10&times; growth, one of the important points was to eliminate undefined behaviour as much as possible. One main point for us was to remove uninitialized variables which often lead to crashing services.</p>
	<p>
		Thanks to P2795R5 by Thomas K&ouml;ppe, uninitialized reads won&rsquo;t be undefined behaviour anymore &ndash; starting from C++26. Instead, they will get a new behaviour called &lsquo;erroneous behaviour&rsquo;.</p>
	<p>
		The great advantage of erroneous behaviour is that it will work just by recompiling existing code. It will diagnose where you forgot to initialize variables. You don&rsquo;t have to systematically go through your code and let&rsquo;s say declare everything as auto to make sure that every variable has an initialized value. Which you probably wouldn&rsquo;t do anyway.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 03 Jul 2025 21:30:04 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Writing Senders &#45;&#45; Lucian Radu Teodorescu</title>
      <link>https://isocpp.org//blog/2025/07/writing-senders-lucian-radu-teodorescu1</link>
      <guid>https://isocpp.org//blog/2025/07/writing-senders-lucian-radu-teodorescu1</guid>
      <description><![CDATA[<p>
	<img alt="logo.png" src="https://isocpp.org/files/img/logo.png" style="width: 225px; margin: 10px; float: right;" />Senders/receivers can be used to introduce concurrency. Lucian Radu Teodorescu describes how to implement senders.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/teodorescu/">Writing Senders</a></h3>
	<p>
		by&nbsp;Lucian Radu Teodorescu</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		If people are just using frameworks based on&nbsp;<code>std::execution</code>, they mainly need to care about senders and schedulers. These are user-facing concepts. However, if people want to implement sender-ready abstractions, they also need to consider receivers and operation states &ndash; these are implementer-side concepts. As this article mainly focuses on the implementation of sender abstractions, we need to discuss these two concepts in more detail.</p>
	<p>
		A receiver is defined in P2300 as &ldquo;<em>a callback that supports more than one channel</em>&rdquo; [<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor003">P2300R10</a>]. The proposal defines a concept for a receiver, unsurprisingly called&nbsp;<code>receiver</code>. To model this concept, a type needs to meet the following conditions:</p>
	<ul>
		<li>
			It must be movable and copyable.</li>
		<li>
			It must have an inner type alias named&nbsp;<code>receiver_concept</code>&nbsp;that is equal to&nbsp;<code>receiver_t</code>&nbsp;(or a derived type).</li>
		<li>
			<code>std::execution::get_env()</code>&nbsp;must be callable on an object of this type (to retrieve the environment of the receiver).</li>
	</ul>
	<p>
		A receiver is the object that receives the sender&rsquo;s completion signal, i.e., one of&nbsp;<code>set_value()</code>,&nbsp;<code>set_error()</code>, or&nbsp;<code>set_stopped()</code>. As explained in the December 2024 issue [<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor005">Teodorescu24</a>], a sender may have different value completion types and different error completion types. For example, the same sender might sometimes complete with&nbsp;<code>set_value(int, int)</code>, sometimes with&nbsp;<code>set_value(double)</code>, sometimes with&nbsp;<code>set_error(std::exception_ptr)</code>, sometimes with&nbsp;<code>set_error(std::error_code)</code>, and sometimes with&nbsp;<code>set_stopped()</code>. This implies that a receiver must also be able to accept multiple types of completion signals.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 01 Jul 2025 21:27:49 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: constexpr Exceptions &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/06/cpp26-constexpr-exceptions-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/06/cpp26-constexpr-exceptions-sandor-dargo</guid>
      <description><![CDATA[<p>
	In recent weeks, we&rsquo;ve explored&nbsp;<a href="https://www.sandordargo.com/blog/2025/04/23/cpp26-constexpr-language-changes">language features</a>&nbsp;and&nbsp;<a href="https://www.sandordargo.com/blog/2025/04/30/cpp26-constexpr-library-changes">library features</a>&nbsp;becoming&nbsp;<code>constexpr</code>&nbsp;in C++26. Those articles weren&rsquo;t exhaustive &mdash; I deliberately left out one major topic: exceptions.</p>
<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 200px;" />Starting with C++26, it will become possible to throw exceptions during constant evaluation. This capability is enabled through both language and library changes. Given the significance of this feature, it deserves its own dedicated post.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/05/07/cpp26-constexpr-exceptions">C++26: constexpr Exceptions</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p id="p3068r6-allowing-exception-throwing-in-constant-evaluation">
		<strong><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r6.html">P3068R6</a>: Allowing exception throwing in constant-evaluation</strong></p>
	<p>
		<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2996r2.html">The proposal for static reflection</a>&nbsp;suggested allowing exceptions in constant-evaluated code, and&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3068r6.html">P3068R6</a>&nbsp;brings that feature to life.</p>
	<p>
		<code>constexpr</code>&nbsp;exceptions are conceptually similar to&nbsp;<code>constexpr</code>&nbsp;allocations. Just as a&nbsp;<code>constexpr string</code>&nbsp;can&rsquo;t escape constant evaluation and reach runtime,&nbsp;<code>constexpr</code>&nbsp;exceptions also have to remain within compile-time code.</p>
	<p>
		Previously, using&nbsp;<code>throw</code>&nbsp;in a&nbsp;<code>constexpr</code>&nbsp;context caused a compilation error. With C++26, such code can now compile &mdash; unless an exception is actually thrown and left uncaught, in which case a compile-time error is still issued. But the error now provides more meaningful diagnostics.</p>
	<p>
		&nbsp;</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 27 Jun 2025 21:08:51 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>An option(al) to surprise you &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/06/an-optional-to-surprise-you-andreas-fertig</link>
      <guid>https://isocpp.org//blog/2025/06/an-optional-to-surprise-you-andreas-fertig</guid>
      <description><![CDATA[<p>
	<img alt="me.png" src="https://isocpp.org/files/img/me.png" style="width: 250px; margin: 10px; float: right; height: 250px;" />In today&#39;s post I share a learning of a customer with you. A while back, a customer asked me to join a debugging session. They had an issue they didn&#39;t (fully) understand.</p>
<blockquote>
	<h3>
		<a href="https://andreasfertig.com/blog/2025/05/an-optional-to-surprise-you/">An option(al) to surprise you</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		<strong>The base</strong></p>
	<p>
		What I will show you is a much down-stripped and, of course, altered version. It was about a message system, but that&#39;s not important. Have a look at the code below.</p>
	<p>
		<img alt="2025-05-09_14-05-45.png" src="https://isocpp.org/files/img/2025-05-09_14-05-45.png" style="margin: 10px;" /></p>
	You can see a class enum for a state and a function&nbsp;<code>Worker</code>. The function takes a&nbsp;<code>State</code>&nbsp;and a&nbsp;<code>const char*</code>&nbsp;message named&nbsp;<code>data</code>. The function&#39;s job is to create a&nbsp;<code>std::optional</code>&nbsp;containing the user data, a C-style string.</blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 25 Jun 2025 21:02:59 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Implementing a Struct of Arrays &#45;&#45; Barry Revzin</title>
      <link>https://isocpp.org//blog/2025/06/implementing-a-struct-of-arrays-barry-revzin</link>
      <guid>https://isocpp.org//blog/2025/06/implementing-a-struct-of-arrays-barry-revzin</guid>
      <description><![CDATA[<p>
	Data-oriented design is all about reorganizing data for better performance, and Andrew Kelley&rsquo;s talk on the topic&mdash;especially his use of Zig&rsquo;s <code data-end="158" data-start="142">MultiArrayList</code>&mdash;offered a compelling real-world example. Inspired by that, this post explores how we can achieve a similar &ldquo;struct-of-arrays&rdquo; approach in C++26 using reflection to build a <code data-end="345" data-start="331">SoaVector&lt;T&gt;</code> that separates member storage for improved memory locality and performance.</p>
<blockquote>
	<h3>
		<a href="https://brevzin.github.io/c++/2025/05/02/soa/">Implementing a Struct of Arrays</a></h3>
	<p>
		by Barry Revzin</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Recently, I watched Andrew Kelley&rsquo;s talk on&nbsp;<a href="https://www.youtube.com/watch?v=IroPQ150F6c">Practical Data Oriented Design</a>. It goes into some of the architectural changes he&rsquo;s been making to the Zig compiler, with pretty significant performance benefit. Would definitely recommend checking out the talk, even if you&rsquo;re like me and have never written any Zig.</p>
	<p>
		About halfway through the talk, he shows a way to improve his memory usage by avoiding wasting memory. By turning this structure:</p>
</blockquote>
<blockquote>
	<pre>
<code>const Monster = struct &#123; &#10;    anim : *Animation, &#10;    kind : Kind, &#10;&#10;    const Kind = enum &#123; &#10;    snake, bat, wolf, dingo, human &#10;    &#125;; &#10;&#125;; &#10;&#10;var monsters : ArrayList(Monster) = .&#123;&#125;; </code></pre>
</blockquote>
<blockquote>
	<p>
		into this one:</p>
	<pre>
<code>var monsters : MultiArrayList(Monster) = .&#123;&#125;; </code></pre>
	<p>
		<code>ArrayList(Monster)</code>&nbsp;is what we could call&nbsp;<code>std::vector&lt;Monster&gt;</code>, and&nbsp;<code>MultiArrayList(Monster)</code>&nbsp;now stores the&nbsp;<code>anim</code>s and&nbsp;<code>kind</code>s in two separate arrays, instead of one. That is, a struct of arrays instead of an array of structs. But it&rsquo;s a&nbsp;<em>tiny</em>&nbsp;code change.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Mon, 23 Jun 2025 20:59:04 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Reflection voted into C++26: &amp;quot;Whole new language&amp;quot;  &#45;&#45; Herb Sutter</title>
      <link>https://isocpp.org//blog/2025/06/reflection-voted-into-cpp26-whole-new-language-herb-sutter</link>
      <guid>https://isocpp.org//blog/2025/06/reflection-voted-into-cpp26-whole-new-language-herb-sutter</guid>
      <description><![CDATA[<p>
	The first trip report from the Sofia meeting is available:</p>
<blockquote>
	<h3>
		<a href="https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/">Trip report: June 2025 ISO C++ standards meeting (Sofia, Bulgaria)</a></h3>
	<p>
		by Herb Sutter</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<h3>
		<img alt="c26-reflection.png" src="https://isocpp.org/files/img/c26-reflection.png" style="width: 400px; margin: 10px; float: right;" />A unique milestone: &ldquo;Whole new language&rdquo;</h3>
	<p>
		Today marks a turning point in C++:&nbsp;A few minutes ago, the C++ committee voted the first seven (7) papers for compile-time reflection into draft C++26&nbsp;to several sustained rounds of applause in the room. I think Hana &ldquo;Ms. Constexpr&rdquo; Dus&iacute;kov&aacute; summarized the impact of this feature best a few days ago, in her calm deadpan way&hellip; when she was told that the reflection paper was going to make it to the Saturday adoption poll, she gave a little shrug and just quietly said:&nbsp;<em>&ldquo;Whole new language.&rdquo;</em></p>
	<p>
		Mic drop.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books, Standardization,]]></dc:subject>
      <pubDate>Sun, 22 Jun 2025 05:16:16 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++20 Concepts for Nicer Compiler Errors &#45;&#45; Daniel Lemire</title>
      <link>https://isocpp.org//blog/2025/06/cpp20-concepts-for-nicer-compiler-errors-daniel-lemire</link>
      <guid>https://isocpp.org//blog/2025/06/cpp20-concepts-for-nicer-compiler-errors-daniel-lemire</guid>
      <description><![CDATA[<p>
	<img alt="image-33-825x510.jpg" src="https://isocpp.org/files/img/image-33-825x510.jpg" style="width: 300px; margin: 10px; float: right; height: 300px;" />Templates are one of C++&rsquo;s most powerful features, enabling developers to write generic, reusable code&mdash;but they come with a cost: notoriously verbose and opaque error messages. With the introduction of concepts in C++20, we can now impose clear constraints on template parameters and get far more helpful diagnostics when something goes wrong.</p>
<blockquote>
	<h3>
		<a href="https://lemire.me/blog/2025/05/03/c20-concepts-for-nicer-compiler-errors/">C++20 Concepts for Nicer Compiler Errors</a></h3>
	<p>
		by Daniel Lemire</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		In C++, templates enable generic programming by allowing functions and classes to operate on different data types without sacrificing type safety. Defined using the template keyword, they let developers write reusable, type-agnostic code, such as functions (e.g., template &lt;typename T&gt; max(T a, T b)) or classes (e.g., std::vector), where the type T is specified at compile time.</p>
	<p>
		Historically, the C++ language has tended to produce complicated compiler error messages. The main culprit is template metaprogramming. C++ templates are powerful but complex. When errors occur in template code, the compiler generates long, verbose messages with nested type information, often involving deep template instantiations. A simple mistake in a template function can produce a message spanning multiple lines with obscure type names.</p>
	<p>
		Let us consider an example. In C++, we often use the &lsquo;Standard Template Library (STL)&rsquo;. It includes a useful dynamic array template: std::vector. A vector manages a sequence of elements with automatic memory handling and flexible sizing. Unlike fixed-size arrays, it can grow or shrink at runtime through operations like push_back to append elements or pop_back to remove them. You can store just about anything in an std::vector but there are some limits. For example, your type must be copyable.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 20 Jun 2025 00:14:43 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: More constexpr in the Standard Library &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/06/cpp26-more-constexpr-in-the-standard-library-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/06/cpp26-more-constexpr-in-the-standard-library-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 200px;" />Here are the standard library features that will soon be usable at compile time. One topic is missing: exceptions. As they need both core language and library changes, I thought they deserved their own post.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/04/30/cpp26-constexpr-library-changes">C++26: More constexpr in the Standard Library</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p id="p2562r1-constexpr-stable-sorting">
		<strong><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2562r1.pdf">P2562R1</a>:&nbsp;<code>constexpr</code>&nbsp;stable sorting</strong></p>
	<p>
		This paper proposes making&nbsp;<code>std::stable_sort</code>,&nbsp;<code>std::stable_partition</code>,&nbsp;<code>std::inplace_merge</code>, and their&nbsp;<code>ranges</code>&nbsp;counterparts usable in constant expressions. While many algorithms have become&nbsp;<code>constexpr</code>&nbsp;over the years, this family related to stable sorting had remained exceptions &mdash; until now.</p>
	<p>
		The recent introduction of&nbsp;<code>constexpr</code>&nbsp;containers gives extra motivation for this proposal. If you can construct a container at compile time, it&rsquo;s only natural to want to sort it there, too. More importantly, a&nbsp;<code>constexpr std::vector</code>&nbsp;can now support efficient, stable sorting algorithms.</p>
	<p>
		A key question is whether the algorithm can meet its computational complexity requirements under the constraints of constant evaluation. Fortunately,&nbsp;<code>std::is_constant_evaluated()</code>&nbsp;provides an escape hatch for implementations. For deeper details, check out the&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2562r1.pdf">proposal</a>&nbsp;itself.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 14 Jun 2025 00:08:18 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Fixing exception safety in our task_sequencer &#45;&#45;  Raymond Chen</title>
      <link>https://isocpp.org//blog/2025/06/fixing-exception-safety-in-our-task-sequencer-raymond-chen</link>
      <guid>https://isocpp.org//blog/2025/06/fixing-exception-safety-in-our-task-sequencer-raymond-chen</guid>
      <description><![CDATA[<p>
	<img alt="RaymondChen_5in-150x150.jpg" src="https://isocpp.org/files/img/RaymondChen_5in-150x150.jpg" style="width: 150px; margin: 10px; float: right;" />Some time ago, we developed a&nbsp;<a href="https://devblogs.microsoft.com/oldnewthing/20220915-00/?p=107182" title="Serializing asynchronous operations in C++/WinRT"><code>task_<wbr />sequencer</code>&nbsp;class</a>&nbsp;for running asynchronous operations in sequence. There&rsquo;s a problem with the implementation of&nbsp;<code>Queue&shy;Task&shy;Async</code>: What happens if an exception occurs?</p>
<blockquote>
	<h3>
		<a href="https://devblogs.microsoft.com/oldnewthing/20250328-00/?p=111016">Fixing Exception Safety in our <code>task_sequencer</code></a></h3>
	<p>
		by Raymond Chen</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Let&rsquo;s look at the various places an exception can occur in&nbsp;<code>Queue&shy;Task&shy;Async</code>.</p>
	<pre tabindex="0">
    template&lt;typename Maker&gt;&#10;    auto QueueTaskAsync(Maker&amp;&amp; maker) -&gt;decltype(maker())&#10;    {&#10;        auto current = std::make_shared&lt;chained_task&gt;();&#10;        auto previous = [&amp;]&#10;        {&#10;            winrt::slim_lock_guard guard(m_mutex);&#10;            return std::exchange(m_latest, current); &larr; oops&#10;        }();&#10;&#10;        suspender suspend;&#10;&#10;        using Async = decltype(maker());&#10;        auto task = [](auto&amp;&amp; current, auto&amp;&amp; makerParam,&#10;                       auto&amp;&amp; contextParam, auto&amp; suspend)&#10;                    -&gt; Async&#10;        {&#10;            completer completer{ std::move(current) };&#10;            auto maker = std::move(makerParam);&#10;            auto context = std::move(contextParam);&#10;&#10;            co_await suspend;&#10;            co_await context;&#10;            co_return co_await maker();&#10;        }(current, std::forward&lt;Maker&gt;(maker),&#10;          winrt::apartment_context(), suspend);&#10;&#10;        previous-&gt;continue_with(suspend.handle);&#10;&#10;        return task;&#10;    }</pre>
</blockquote>
<blockquote>
	<p>
		If an exception occurs at&nbsp;<code>make_<wbr />shared</code>, then no harm is done because we haven&rsquo;t done anything yet.</p>
	<p>
		If an exception occurs when starting the lambda task, then we are in trouble. We have already linked the&nbsp;<code>current</code>&nbsp;onto&nbsp;<code>m_latest</code>, but we will never call&nbsp;<code>continue_<wbr />with()</code>, so the chain of tasks stops making progress.</p>
	<p>
		To fix this, we need to delay hooking up the&nbsp;<code>current</code>&nbsp;to the chain of&nbsp;<code>chained_<wbr />task</code>s until we are sure that we have a task to chain.&nbsp;</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Tue, 10 Jun 2025 00:08:25 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>How to Join or Concat Ranges, C++26 &#45;&#45; Bartlomiej Filipek</title>
      <link>https://isocpp.org//blog/2025/06/how-to-join-or-concat-ranges-cpp26-bartlomiej-filipek</link>
      <guid>https://isocpp.org//blog/2025/06/how-to-join-or-concat-ranges-cpp26-bartlomiej-filipek</guid>
      <description><![CDATA[<p>
	<img alt="howtojoinconcat-filipek.png" src="https://isocpp.org/files/img/howtojoinconcat-filipek.png" style="width: 400px; margin: 10px; float: right;" />C++ continues to refine its range library, offering developers more efficient and expressive ways to manipulate collections. In this post, we&#39;ll dive into three powerful range adaptors&mdash;<code data-end="198" data-start="185">concat_view</code>, <code data-end="211" data-start="200">join_view</code>, and <code data-end="233" data-start="217">join_with_view</code>&mdash;exploring their differences, use cases, and practical examples.</p>
<blockquote>
	<h3>
		<a href="https://www.cppstories.com/2025/join_concat_ranges/">How to Join or Concat Ranges, C++26</a></h3>
	<p>
		by Bartlomiej Filipek</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Modern C++ continuously improves its range library to provide more expressive, flexible, and efficient ways to manipulate collections. Traditionally, achieving tasks like concatenation and flattening required manual loops, copying, or custom algorithms. With C++&rsquo;s range adaptors, we now have an elegant and efficient way to process collections lazily without unnecessary allocations.</p>
	<p>
		In this post, we will explore three powerful range adaptors introduced in different C++ standards:</p>
	<ul>
		<li>
			<code>std::ranges::concat_view</code>&nbsp;(C++26)</li>
		<li>
			<code>std::ranges::join_view</code>&nbsp;(C++20)</li>
		<li>
			<code>std::ranges::join_with_view</code>&nbsp;(C++23)</li>
	</ul>
	<p>
		Let&rsquo;s break down their differences, use cases, and examples.</p>
	<p id="stdrangesconcat_view-c26">
		<strong><code>std::ranges::concat_view</code>&nbsp;(C++26)</strong></p>
	<p>
		The&nbsp;<code>concat_view</code>&nbsp;allows you to concatenate multiple independent ranges into a single sequence. Unlike&nbsp;<code>join_view</code>, it does not require a range of ranges&mdash;it simply merges the given ranges sequentially while preserving their structure.</p>
	<p>
		In short:</p>
	<ul>
		<li>
			Takes multiple independent ranges as arguments.</li>
		<li>
			Supports&nbsp;random access&nbsp;if all underlying ranges support it.</li>
		<li>
			Allows modification if underlying ranges are writable.</li>
		<li>
			Lazy evaluation: No additional memory allocations.</li>
	</ul>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 06 Jun 2025 00:02:04 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Function overloading is more flexible than template function specialization &#45;&#45; Raymond Chen</title>
      <link>https://isocpp.org//blog/2025/05/function-overloading-is-more-flexible-than-template-function-specialization</link>
      <guid>https://isocpp.org//blog/2025/05/function-overloading-is-more-flexible-than-template-function-specialization</guid>
      <description><![CDATA[<p>
	<img alt="RaymondChen_5in-150x150.jpg" src="https://isocpp.org/files/img/RaymondChen_5in-150x150.jpg" style="width: 150px; margin: 10px; float: right;" />When trying to specialize a templated function for specific types, it&rsquo;s easy to fall into subtle traps around how parameter types are matched. A colleague recently ran into this issue while attempting to specialize a function for a <code data-end="240" data-start="232">Widget</code> and a string literal, only to be met with confusing compiler errors that hinted at deeper quirks in C++&#39;s type deduction and function template specialization rules.</p>
<blockquote>
	<h3>
		<a href="https://devblogs.microsoft.com/oldnewthing/20250410-00/?p=111063">Function overloading is more flexible (and more convenient) than template function specialization </a></h3>
	<p>
		by Raymond Chen</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		A colleague of mine was having trouble specializing a templated function. Here&rsquo;s a simplified version.</p>
	<pre tabindex="0">
template&lt;typename T, typename U&gt;&#10;bool same_name(T const&amp; t, U const&amp; u)&#10;{&#10;    return t.name() == u.name();&#10;}&#10;</pre>
	<p>
		They wanted to provide a specialization for the case that the parameters are a Widget and a string literal.</p>
	<pre tabindex="0">
template&lt;&gt;&#10;bool same_name&lt;Widget, const char[]&gt;(Widget const&amp; widget, const char name[])&#10;{&#10;    return strcmp(widget.descriptor().name().c_str(), name) == 0;&#10;}&#10;</pre>
	<p>
		However, this failed to compile:</p>
	<pre tabindex="0">
// msvc&#10;error C2912: explicit specialization &#39;bool &#10;same_name&lt;Widget,const char[]&gt;(const Widget &amp;,const char &#10;[])&#39; is not a specialization of a function template&#10;</pre>
	<p>
		What do you mean &ldquo;not a specialization of a function template&rdquo;? I mean doesn&rsquo;t it look like a specialization of a function template? It sure follows the correct syntax for a function template specialization.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 30 May 2025 00:01:52 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: More constexpr in the Core Language &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/05/cpp26-more-constexpr-in-the-core-language-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/05/cpp26-more-constexpr-in-the-core-language-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 200px;" />In this article, we review how&nbsp;<code>constexpr</code>&nbsp;evolves in the C++26 core language. We are getting&nbsp;<code>constexpr</code>&nbsp;cast from&nbsp;<code>void*</code>, placement&nbsp;<code>new</code>, structured bindings and even exceptions (not discussed today).&nbsp;</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/04/23/cpp26-constexpr-language-changes">C++26: More constexpr in the Core Language</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Since&nbsp;<code>constexpr</code>&nbsp;was added to the language in C++11, its scope has been gradually expanded. In the beginning, we couldn&rsquo;t even use&nbsp;<code>if</code>,&nbsp;<code>else</code>&nbsp;or loops, which were changed in C++14. C++17 added support for&nbsp;<code>constexpr</code>&nbsp;lambdas. C++20 added the ability to use allocation and use&nbsp;<code>std::vector</code>&nbsp;and&nbsp;<code>std::string</code>&nbsp;in constant expressions. In this article, let&rsquo;s see how constexpr evolves with C++26. To be more punctual, let&rsquo;s see what language features become more&nbsp;<code>constexpr</code>-friendly. We&rsquo;ll discuss library changes in a separate article, as well as&nbsp;<code>constexpr</code>&nbsp;exceptions, which need both language and library changes.</p>
	<p id="p2738r1-constexpr-cast-from-void">
		<strong><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2738r1.pdf">P2738R1</a>:&nbsp;<code>constexpr</code>&nbsp;cast from&nbsp;<code>void*</code></strong></p>
	<p>
		Thanks to the acceptance of&nbsp;<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2738r1.pdf">P2738R1</a>, starting from C++26, one can cast from&nbsp;<code>void*</code>&nbsp;to a pointer of type&nbsp;<code>T</code>&nbsp;in constant expressions, if the type of the object at that adress is exactly the type of&nbsp;<code>T</code>.</p>
	<p>
		Note that conversions to interconvertible - including pointers to base classes - or not related types are not permitted.</p>
	<p>
		The motivation behind this change is to make several standard library functions or types work at compile time. To name a few examples:&nbsp;<em>std::format</em>,&nbsp;<em>std::function</em>,&nbsp;<em>std::function_ref</em>,&nbsp;<em>std::any</em>. The reason why this change will allow many more for more&nbsp;<code>constexpr</code>&nbsp;in the standard library is that storing&nbsp;<code>void*</code>&nbsp;is a commonly used compilation firewall technique to reduce template instantiations and the number of symbols in compiled binaries.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 28 May 2025 00:01:22 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Streamlined Iteration: Exploring Keys and Values in C++20 &#45;&#45; Daniel Lemire</title>
      <link>https://isocpp.org//blog/2025/05/streamlined-iteration-exploring-keys-and-values-in-cpp20-daniel-lemire</link>
      <guid>https://isocpp.org//blog/2025/05/streamlined-iteration-exploring-keys-and-values-in-cpp20-daniel-lemire</guid>
      <description><![CDATA[<p>
	<img alt="image-27-825x510.jpg" src="https://isocpp.org/files/img/image-27-825x510.jpg" style="width: 400px; margin: 10px; float: right;" />Modern C++ offers a variety of ways to work with key-value data structures like <code data-end="90" data-start="80">std::map</code> and <code data-end="115" data-start="95">std::unordered_map</code>, from traditional loops to sleek functional-style expressions using C++20 ranges. By exploring both styles and benchmarking them across platforms, we can better understand how newer language features affect readability, expressiveness, and performance.</p>
<blockquote>
	<h3>
		<a href="https://lemire.me/blog/2025/04/20/iterating-through-keys-and-values-in-c-with-c20-code/">Streamlined Iteration: Exploring Keys and Values in C++20</a></h3>
	<p>
		by Daniel Lemire</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		In software, we often use key-value data structures, where each key is unique and maps to a specific value. Common examples include dictionaries in Python, hash maps in Java, and objects in JavaScript. If you combine arrays with key-value data structures, you can represent most data.</p>
	<p>
		In C++, we have two standard key-value data structures: the std::map and the std::unordered_map. Typically, the std::map is implemented as a tree (e.g., a red-black tree) with sorted keys, providing logarithmic time complexity O(log n) for lookups, insertions, and deletions, and maintaining keys in sorted order. The std::unordered_map is typically implemented as a hash table with unsorted keys, offering average-case constant time complexity O(1) for lookups, insertions, and deletions. In the std::unordered_map, the hash table uses a hashing function to map keys to indices in an array of buckets. Each bucket is essentially a container that can hold multiple key-value pairs, typically implemented as a linked list. When a key is hashed, the hash function computes an index corresponding to a bucket. If multiple keys hash to the same bucket (a collision), they are stored in that bucket&rsquo;s linked list.</p>
	<p>
		Quite often, we only need to look at the keys, or look at the values. The C++20 standard makes this convenient through the introduction of ranges (std::ranges::views::keys and std::ranges::views::values). Let us consider two functions using the &lsquo;modern&rsquo; functional style. The first function sums the values and the next function counts how many keys (assuming that they are strings) start with a given prefix.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Fri, 23 May 2025 23:50:58 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Owning and non&#45;owning C++ Ranges &#45;&#45; Hannes Hauswedell</title>
      <link>https://isocpp.org//blog/2025/05/owning-and-non-owning-cpp-ranges-hannes-hauswedell</link>
      <guid>https://isocpp.org//blog/2025/05/owning-and-non-owning-cpp-ranges-hannes-hauswedell</guid>
      <description><![CDATA[<p>
	This is the first article in a series discussing some of the underlying properties of C++ ranges and in particular <em>range adaptors</em>. At the same time, I introduce the design of an experimental library which aims to solve some of the problems discussed here.</p>
<blockquote>
	<h3>
		<a href="https://hannes.hauswedell.net/post/2025/05/17/non-owning-range/">Owning and non-owning C++ Ranges</a></h3>
	<p>
		by Hannes Hauswedell</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		We will begin by having a look at ranges from the standard library prior to C++20, since this is what people are most used to. Note that although the ranges themselves are from C++17, I will use some terminology/concepts/algorithms introduced later to explain how they relate to each other. Remember that to count as a range in C++, a type needs to have just <code>begin()</code> and <code>end()</code>. Everything else is bonus.</p>
	<p>
		[&hellip;]</p>
	<p>
		Containers are the ranges everybody already used before Ranges were a thing. They <em>own</em> their elements, i.e. the storage of the elements is managed by the container and the elements disappear when the container does. Containers are multi-pass ranges, i.e. you can iterate over them multiple times and will always observe the same elements.</p>
	<p>
		[&hellip;]</p>
	<p>
		If containers are owning ranges, what are non-owning ranges? C++17 introduced a first example: <code>std::string_view</code>, a range that consists just of a <code>begin</code> and <code>end</code> pointer into another range&rsquo;s elements.</p>
	<p>
		[&hellip;]</p>
	<p>
		However, the most important (and controversial) change came by way of P2415, which allowed views to become owning ranges. It was also applied to C++20 as a defect report, although it was quite a significant design change. This is a useful feature, however, it resulted in the <code>std::ranges::view</code> concept being changed to where it no longer means &ldquo;non-owning range&rdquo;.</p>
	<p>
		[&hellip;]</p>
</blockquote>
<p>
	&nbsp;</p>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 22 May 2025 16:40:55 +0000</pubDate>
      <dc:creator>Hannes Hauswedell</dc:creator>
    </item>

    <item>
      <title>How to break or continue from a lambda loop? &#45;&#45; Vittorio Romeo</title>
      <link>https://isocpp.org//blog/2025/05/how-to-break-or-continue-from-a-lambda-loop-vittorio-romeo</link>
      <guid>https://isocpp.org//blog/2025/05/how-to-break-or-continue-from-a-lambda-loop-vittorio-romeo</guid>
      <description><![CDATA[<p>
	Is it possible to write a simple iteration API that hides implementation details <em>and</em> lets users break and continue?</p>
<p>
	Here&#39;s a new article about a lightweight solution using a `ControlFlow` enumeration!</p>
<blockquote>
	<h3>
		<a href="https://vittorioromeo.com/index/blog/controlflow.html"><strong>How to break or continue from a lambda loop?</strong></a></h3>
	<p>
		by Vittorio Romeo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		Here&rsquo;s an encapsulation challenge that I frequently run into: how to let users iterate over an internal data structure without leaking implementation details, but still giving them full control over the loop?</p>
	<p>
		Implementing a custom iterator type requires significant boilerplate and/or complexity, depending on the underlying data structure.</p>
	<p>
		Coroutines are simple and elegant, but the codegen is atrocious &ndash; definitely unsuitable for hot paths.</p>
</blockquote>
<p>
	&nbsp;</p>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 22 May 2025 13:05:47 +0000</pubDate>
      <dc:creator>Vittorio Romeo</dc:creator>
    </item>

    <item>
      <title>Raw Loops for Performance? &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/05/raw-loops-for-performance-sandor-dargo</link>
      <guid>https://isocpp.org//blog/2025/05/raw-loops-for-performance-sandor-dargo</guid>
      <description><![CDATA[<p>
	<img alt="SANDOR_DARGO_ROUND.JPG" src="https://isocpp.org/files/img/SANDOR_DARGO_ROUND.JPG" style="width: 200px; margin: 10px; float: right; height: 200px;" />Using ranges or algorithms has several advantages over raw loops, notably readability. On the other hand, as we&rsquo;ve just seen, sheer performance is not necessarily among those advantages. Using ranges can be slightly slower than a raw loop version. But that&rsquo;s not necessarily a problem, it really depends on your use case. Most probably it won&rsquo;t make a bit difference.</p>
<blockquote>
	<h3>
		<a href="https://www.sandordargo.com/blog/2025/04/16/raw-loops-for-performance">Raw Loops for Performance?</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		To my greatest satisfaction, I&rsquo;ve recently joined a new project. I started to read through the codebase before joining and at that stage, whenever I saw a possibility for a minor improvement, I raised a tiny pull request. One of my pet peeves is rooted in Sean Parent&rsquo;s 2013 talk at GoingNative,&nbsp;<a href="https://www.youtube.com/watch?v=W2tWOdzgXHA">Seasoning C++</a>&nbsp;where he advocated for&nbsp;<em>no raw loops</em>.</p>
	<p>
		When I saw this loop, I started to think about how to replace it:</p>
	<p>
		<img alt="2025-05-08_16-46-14.png" src="https://isocpp.org/files/img/2025-05-08_16-46-14.png" style="margin: 10px;" /></p>
	<p>
		<em>Please note that the example is simplified and slightly changed so that it compiles on its own.</em></p>
	<p>
		Let&rsquo;s focus on&nbsp;<code>foo</code>, the rest is there just to make the example compilable.</p>
	<p>
		It seems that we could use&nbsp;<code>std::transform</code>. But heck, we use C++20 we have ranges at our hands so let&rsquo;s go with&nbsp;<code>std::ranges::transform</code>!</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Wed, 21 May 2025 23:44:22 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>constexpr Functions: Optimization vs Guarantee &#45;&#45; Andreas Fertig</title>
      <link>https://isocpp.org//blog/2025/05/constexpr-functions-optimization-vs-guarantee-andreas-fertig</link>
      <guid>https://isocpp.org//blog/2025/05/constexpr-functions-optimization-vs-guarantee-andreas-fertig</guid>
      <description><![CDATA[<p>
	<img alt="Depositphotos_193487484_S.jpg" src="https://isocpp.org/files/img/Depositphotos_193487484_S.jpg" style="width: 250px; margin: 10px; float: right; height: 260px;" />Constexpr has been around for a while now, but many don&rsquo;t fully understand its subtleties. Andreas Fertig explores its use and when a constexpr expression might not be evaluated at compile time.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/fertig/">constexpr Functions: Optimization vs Guarantee</a></h3>
	<p>
		by Andreas Fertig</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		The feature of constant evaluation is nothing new in 2023. You have constexpr available since C++11. Yet, in many of my classes, I see that people still struggle with&nbsp;<code>constexpr</code>&nbsp;functions. Let me shed some light on them.</p>
	<p>
		<strong>What you get is not what you see</strong></p>
	<p>
		One thing, which is a feature, is that&nbsp;<code>constexpr</code>&nbsp;functions can be evaluated at compile-time, but they can run at run-time as well. That evaluation at compile-time requires all values known at compile-time is reasonable. But I often see that the assumption is once all values for a&nbsp;<code>constexpr</code>&nbsp;function are known at compile-time, the function will be evaluated at compile-time.</p>
	<p>
		I can say that I find this assumption reasonable, and discovering the truth isn&rsquo;t easy. Let&rsquo;s consider an example (Listing 1).</p>
	<table style="width:945px;">
		<tbody>
			<tr>
				<td>
					<pre>
constexpr auto Fun(int v)&#10;{&#10;  return 42 / v; &#9312;&#10;}&#10;&#10;int main()&#10;{&#10;  const auto f = Fun(6); &#9313;&#10;  return f;              &#9314;&#10;}</pre>
				</td>
			</tr>
			<tr>
				<td>
					Listing 1</td>
			</tr>
		</tbody>
	</table>
	<p>
		The&nbsp;<code>constexpr</code>&nbsp;function&nbsp;<code>Fun</code>&nbsp;divides 42 by a value provided by the parameter&nbsp;<code>v</code>&nbsp;&#9312;. In&nbsp;&#9313;, I call&nbsp;<code>Fun</code>&nbsp;with the value&nbsp;<code>6</code>&nbsp;and assign the result to the variable&nbsp;<code>f</code>.</p>
	<p>
		Last, in&nbsp;&#9314;, I return the value of&nbsp;<code>f</code>&nbsp;to prevent the compiler optimizes this program away. If you use Compiler Explorer to look at the resulting assembly, GCC with&nbsp;<code>-O1</code>&nbsp;brings this down to:</p>
	<pre>
  main:&#10;          mov     eax, 7&#10;          ret</pre>
	<p>
		As you can see, the compiler has evaluated the result of 42 / 6, which, of course, is 7. Aside from the final number, there is also no trace at all of the function&nbsp;<code>Fun</code>.</p>
	<p>
		Now, this is what, in my experience, makes people believe that&nbsp;<code>Fun</code>&nbsp;was evaluated at compile-time thanks to&nbsp;<code>constexpr</code>. Yet this view is incorrect. You are looking at compiler optimization, something different from&nbsp;<code>constexpr</code>&nbsp;functions.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Mon, 19 May 2025 23:41:11 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>C++26: Erroneous Behaviour &#45;&#45; Sandor Dargo</title>
      <link>https://isocpp.org//blog/2025/05/cpp26-erroneous-behaviour-sandor-dargo1</link>
      <guid>https://isocpp.org//blog/2025/05/cpp26-erroneous-behaviour-sandor-dargo1</guid>
      <description><![CDATA[<p>
	<img alt="Depositphotos_287607756_S.jpg" src="https://isocpp.org/files/img/Depositphotos_287607756_S.jpg" style="width: 200px; margin: 10px; float: right; height: 200px;" />C++&rsquo;s undefined behaviour impacts safety. Sandor Dargo explains how and why uninitialised reads will become erroneous behaviour in C++26, rather than being undefined behaviour.</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/dargo/">C++26: Erroneous Behaviour</a></h3>
	<p>
		by Sandor Dargo</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		If you pick a random talk at a C++ conference these days, there is a fair chance that the speaker will mention safety at least a couple of times. It&rsquo;s probably fine like that. The committee and the community must think about improving both the safety situation and the reputation of C++.</p>
	<p>
		If you follow what&rsquo;s going on in this space, you are probably aware that people have different perspectives on safety. I think almost everybody finds it important, but they would solve the problem in their own way.</p>
	<p>
		A big source of issues is certain manifestations of undefined behaviour. It affects both the safety and the stability of software. I remember that a few years ago when I was working on some services which had to support a 10&times; growth, one of the important points was to eliminate undefined behaviour as much as possible. One main point for us was to remove uninitialized variables which often lead to crashing services.</p>
	<p>
		Thanks to P2795R5 by Thomas K&ouml;ppe, uninitialized reads won&rsquo;t be undefined behaviour anymore &ndash; starting from C++26. Instead, they will get a new behaviour called &lsquo;erroneous behaviour&rsquo;.</p>
	<p>
		The great advantage of erroneous behaviour is that it will work just by recompiling existing code. It will diagnose where you forgot to initialize variables. You don&rsquo;t have to systematically go through your code and let&rsquo;s say declare everything as auto to make sure that every variable has an initialized value. Which you probably wouldn&rsquo;t do anyway.</p>
	<p>
		But what is this new behaviour that on C++ Reference is even listed on the page of undefined behaviour? [<a href="https://accu.org/journals/overload/33/186/dargo/#_idTextAnchor000">CppRef-1</a>] It&rsquo;s well-defined, yet incorrect behaviour that compilers are&nbsp;recommended&nbsp;to diagnose.&nbsp;<em>Is recommended enough?!</em>&nbsp;Well, with the growing focus on safety, you can rest assured that an implementation that wouldn&rsquo;t diagnose erroneous behaviour would be soon out of the game.</p>
	<p>
		Some compilers can already identify uninitialized reads &ndash; what nowadays falls under undefined behaviour. For example, clang and gcc with&nbsp;<code>-ftrivial-auto-var-init=zero</code>&nbsp;have already offered default initialization of variables with automatic storage duration. This means that the technique to identify these variables is already there. The only thing that makes this approach not practical is that you will not know which variables you failed to initialize.</p>
	<p>
		Instead of default initialization, with erroneous behaviour, an uninitialized object will be initialized to an implementation-specific value. Reading such a value is a conceptual error that is recommended and encouraged to be diagnosed by the compiler. That might happen through warnings, run-time errors, etc.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Sat, 17 May 2025 23:38:13 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    <item>
      <title>Writing Senders &#45;&#45; Lucian Radu Teodorescu</title>
      <link>https://isocpp.org//blog/2025/05/writing-senders-lucian-radu-teodorescu</link>
      <guid>https://isocpp.org//blog/2025/05/writing-senders-lucian-radu-teodorescu</guid>
      <description><![CDATA[<p>
	<img alt="2025-05-08_16-35-43.png" src="https://isocpp.org/files/img/2025-05-08_16-35-43.png" style="width: 400px; margin: 10px; float: right;" />In the December issue of&nbsp;<em>Overload</em>&nbsp;[<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor005">Teodorescu24</a>], we provided a gentle introduction to senders/receivers, arguing that it is easy to write programs with senders/receivers. Then, in the February issue [<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor006">Teodorescu25a</a>], we had an article that walked the reader through some examples showing how senders/receivers can be used to introduce concurrency in an application. Both of these articles focused on the end users of senders/receivers. This article focuses on the implementer&rsquo;s side: what does it take to implement senders?</p>
<blockquote>
	<h3>
		<a href="https://accu.org/journals/overload/33/186/teodorescu/">Writing Senders</a></h3>
	<p>
		by Lucian Radu Teodorescu</p>
</blockquote>
<p>
	From the article:</p>
<blockquote>
	<p>
		If people are just using frameworks based on&nbsp;<code>std::execution</code>, they mainly need to care about senders and schedulers. These are user-facing concepts. However, if people want to implement sender-ready abstractions, they also need to consider receivers and operation states &ndash; these are implementer-side concepts. As this article mainly focuses on the implementation of sender abstractions, we need to discuss these two concepts in more detail.</p>
	<p>
		A receiver is defined in P2300 as &ldquo;<em>a callback that supports more than one channel</em>&rdquo; [<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor003">P2300R10</a>]. The proposal defines a concept for a receiver, unsurprisingly called&nbsp;<code>receiver</code>. To model this concept, a type needs to meet the following conditions:</p>
	<ul>
		<li>
			It must be movable and copyable.</li>
		<li>
			It must have an inner type alias named&nbsp;<code>receiver_concept</code>&nbsp;that is equal to&nbsp;<code>receiver_t</code>&nbsp;(or a derived type).</li>
		<li>
			<code>std::execution::get_env()</code>&nbsp;must be callable on an object of this type (to retrieve the environment of the receiver).</li>
	</ul>
	<p>
		A receiver is the object that receives the sender&rsquo;s completion signal, i.e., one of&nbsp;<code>set_value()</code>,&nbsp;<code>set_error()</code>, or&nbsp;<code>set_stopped()</code>. As explained in the December 2024 issue [<a href="https://accu.org/journals/overload/33/186/teodorescu/#_idTextAnchor005">Teodorescu24</a>], a sender may have different value completion types and different error completion types. For example, the same sender might sometimes complete with&nbsp;<code>set_value(int, int)</code>, sometimes with&nbsp;<code>set_value(double)</code>, sometimes with&nbsp;<code>set_error(std::exception_ptr)</code>, sometimes with&nbsp;<code>set_error(std::error_code)</code>, and sometimes with&nbsp;<code>set_stopped()</code>. This implies that a receiver must also be able to accept multiple types of completion signals.</p>
	<p>
		The need for completion signatures is not directly visible in the&nbsp;<code>receiver</code>&nbsp;concept. There is another concept that the P2300 proposal defines, which includes the completion signatures for a receiver:&nbsp;<code>receiver_of&lt;Completions&gt;</code>. A type models this concept if it also models the&nbsp;<code>receiver</code>&nbsp;concept and provides functions to handle the completions indicated by&nbsp;<code>Completions</code>. More details on how these completions look will be covered in the example sections.</p>
</blockquote>]]></description>
      <dc:subject><![CDATA[News, Articles & Books,]]></dc:subject>
      <pubDate>Thu, 15 May 2025 23:33:55 +0000</pubDate>
      <dc:creator>Blog Staff</dc:creator>
    </item>

    
    </channel>
</rss>