January 2024

2024-01 Mailing Available

The 2024-01 mailing of new standards papers is now available.

 

WG21 Number Title Author Document Date Mailing Date Previous Version Subgroup
P1255R11 A view of 0 or 1 elements: views::maybe Steve Downey 2024-01-12 2024-01 P1255R10 SG9 Ranges,LEWG Library Evolution
P1255R12 A view of 0 or 1 elements: views::maybe Steve Downey 2024-01-16 2024-01 P1255R11 SG9 Ranges,LEWG Library Evolution,LWG Library
P1709R5 Graph Library Phillip Ratzloff 2024-01-15 2024-01 P1709R4 SG6 Numerics,SG14 Low Latency,SG19 Machine Learning
P2019R5 Thread attributes Corentin Jabot 2024-01-13 2024-01 P2019R4 LEWG Library Evolution
P2527R3 std::variant_alternative_index and std::tuple_element_index Alex Christensen 2024-01-02 2024-01 P2527R2 LEWG Library Evolution
P2664R6 Proposal to extend std::simd with permutation API Daniel Towner 2024-01-16 2024-01 P2664R5 SG1 Concurrency and Parallelism,LEWG Library Evolution
P2748R3 Disallow Binding a Returned Glvalue to a Temporary Brian Bi 2024-01-08 2024-01 P2748R2 CWG Core
P2748R4 Disallow Binding a Returned Glvalue to a Temporary Brian Bi 2024-01-08 2024-01 P2748R3 CWG Core
P2835R2 Expose std::atomic_ref's object address Gonzalo Brito Gadeschi 2024-01-10 2024-01 P2835R1 LEWG Library Evolution
P2894R2 Constant evaluation of Contracts Timur Doumler 2024-01-11 2024-01 P2894R1 SG21 Contracts
P2900R4 Contracts for C++ Joshua Berne 2024-01-16 2024-01 P2900R3 SG21 Contracts
P2932R3 A Principled Approach to Open Design Questions for Contracts Joshua Berne 2024-01-15 2024-01 P2932R2 SG21 Contracts
P2946R1 A flexible solution to the problems of `noexcept` Pablo Halpern 2024-01-15 2024-01 P2946R0 EWGI SG17: EWG Incubator,EWG Evolution
P2957R1 Contracts and coroutines Andrzej Krzemieński 2024-01-13 2024-01 P2957R0 SG21 Contracts
P2963R1 Ordering of constraints involving fold expressions Corentin Jabot 2024-01-13 2024-01 P2963R0 EWG Evolution
P2988R1 std::optional<T&> Steve Downey 2024-01-05 2024-01 P2988R0 LEWG Library Evolution,LWG Library
P3044R0 sub-string_view from string Michael Florian Hava 2024-01-15 2024-01   LEWG Library Evolution
P3054R0 2023-12 Library Evolution Poll Outcomes Inbal Levi 2024-01-13 2024-01   All of WG21
P3079R0 Should ignore and observe exist for constant evaluation of contracts? Oliver Rosten 2024-01-11 2024-01   SG21 Contracts
P3084R0 Slides for LEWG views::maybe 20240109 Steve Downey 2024-01-12 2024-01   LEWG Library Evolution
P3086R0 Proxy: A Pointer-Semantics-Based Polymorphism Library Mingxin Wang 2024-01-16 2024-01   LEWGI SG18: LEWG Incubator,LEWG Library Evolution
P3087R0 Make direct-initialization for enumeration types at least as permissive as direct-list-initializatio Jan Schultke 2024-01-16 2024-01   LEWGI SG18: LEWG Incubator

Use SIMD: Save The Planet -- Andrew Drakeford

simddrake.pngWriting efficient code is challenging but worthwhile. Andrew Drakeford demonstrates how SIMD (Single Instruction Multiple Data) can reduce your carbon footprint.

Use SIMD: Save The Planet

by Andrew Drakeford

From the article:

Some sources claim that data centres consumed 2.9% of the world’s electricity in 2021 [Andrae15]. With the recent sharp increase in energy prices, many firms became aware of this cost. Additionally, trends in AI use and the near-exponential growth in both network and data services projected over the next few years [Jones18] suggest that this situation will only get worse.

A data centre’s single purpose is to run our software (not heat the planet). But what if the processing cores that our software runs on have a unique, often unused, feature that would enable them to do the work several times faster? Would this also mean several times more efficiently? This feature is SIMD (Single Instruction Multiple Data).

SIMD is a parallel computing technology that allows processors to perform the same operation on multiple data elements simultaneously. By using SIMD instructions, a single CPU instruction can operate on multiple data elements in a single clock cycle. For example, with 256-bit SIMD registers, it is possible to process eight 32-bit floating-point numbers or sixteen 16-bit integers in parallel. This leverages the data-level parallelism inherent in many algorithms, such as mathematical computations, image processing, audio processing, and simulations. Figure 1 illustrates the element-wise addition of two sets of numbers using the SSE2, AVX2 and AVX512 instructions sets.


 

SIMD instructions use vector registers, which can hold multiple data elements. These registers allow the CPU to apply a single instruction to all the elements simultaneously, thus reducing the instruction count. Consequently, SIMD can provide a substantial speedup for tasks that exhibit regular and parallelizable data processing patterns.

Six Handy Operations for String Processing in C++20/23 -- Bartlomiej Filipek

sixhandy-barto.pngIn this article, we’ll explore six practical string processing operations introduced in C++20 and C++23. These features represent an evolution in this crucial area, covering a spectrum of operations from searching and appending to creation and stream handling.

Six Handy Operations for String Processing in C++20/23

by Bartlomiej Filipek

From the article:

Let’s start with a simple yet long-awaited feature…

1. contains(), C++23

Finally, after decades of standardization, we have a super easy way to check if there’s one string inside the other. No need to use .find(str) != npos!

Before C++23:

sixhandy-1.png

And now, thanks to the proposal: P1679R3:
sixhandy-2.png
As you can see, the new approach with contains() is more straightforward and intuitive.

How to Print Unicode Text to the Windows Console in C++ -- Giovanni Dicanio

Have you ever wondered how to correctly print Unicode text to the Windows console in your C++ programs? Maybe you tried something, and you got meaningless output, or even an assertion failure at runtime, pointing to some obscure code in the CRT? Well, then this article is for you!

How to Print Unicode Text to the Windows Console in C++

by Giovanni Dicanio

From the blog post:

Suppose that you want to print out some Unicode text to the Windows console. From a simple C++ console application created in Visual Studio, you may try this line of code inside main:

std::wcout << L"Japan written in Japanese: x65e5x672c (Nihon)n";

As you can see, the Japanese kanjis are not printed. Moreover, even the “standard ASCII” characters following those (i.e.: “(Nihon)”) are missing. There’s clearly a bug in the above code.

How can you fix that?

Well, the missing piece is ...

Breaking Down C++20 Callable Concepts -- John Farrier

Learn about C++20's Callable Concepts, how they improve on SFINAE, and how to use them in your own code.

Breaking Down C++20 Callable Concepts

By John Farrier

From the article:

C++20 Callable Concepts refer to a powerful feature introduced in the C++20 standard that allows developers to specify and enforce constraints on function objects, lambdas, and other callable entities in a more expressive and type-safe manner. Callable Concepts enable the compiler to check if a given callable meets specific requirements, such as having certain member functions or satisfying particular type traits, before allowing it to be used in a template or function. This helps improve code readability, maintainability, and error detection, as it provides clearer and more structured ways to define the expected behavior and capabilities of callables in C++ code.

 

Easily Protect Your C++ Code Against Integer Overflow With SafeInt -- by Giovanni Dicanio

Integer overflows can be hidden inside your C++ code and can cause subtle nasty bugs.

Fortunately, it's easy to guard your code against those subtle bugs, thanks to an open-source easy-to-use library:

Protecting Your C++ Code Against Integer Overflow Made Easy by SafeInt

by Giovanni Dicanio

From the article:

In previous blog posts I discussed the problem of integer overflow and some subtle bugs that can be caused by that. (...)

Of course, writing this kind of complicated check code each time there is a sum operation that could potentially overflow would be excruciatingly cumbersome, and bug prone! (...)

Fortunately, you don’t have to do all that work! In fact, there is an open source library that does exactly that! This library is called SafeInt. (...)

The code will still look nice and simple, but safety checks will happen automatically under the hood. Thank you very much SafeInt and C++ operator overloading!

 

C++ quiz by PVS-Studio and Sergei Kushnirenko

The PVS-Studio team along with Sergei Kushnirenko prepared a quiz based on his publications about errors he found. Take the quiz, challenge your focus and coding skills while looking for errors in the C++ code. Attention! When taking the quiz, you may exclaim that some tasks are unfair. Indeed. However, please relax and approach them with humor. The quiz is just for fun.

C++ quiz by PVS-Studio and Sergei Kushnirenko

by Sergei Kushnirenko

About the quiz:

After taking the quiz, you may have questions about why this or that answer is marked as correct or incorrect. Welcome to the article: "Breaking down the C++ quiz by Sergei Kushnirenko" — here you will find answers to your questions.  Please read it only after you have puzzled over code snippets with errors and undefined behavior. Be sure — it will be more interesting.

When an Empty Destructor is Required -- Andreas Fertig

me.pngIn my previous post, "Why you shouldn't provide an empty destructor," we discussed the importance of not providing an empty destructor in most cases. However, in this post, we'll explore a rare exception to this rule that arises when using the PImpl idiom to hide implementation details, specifically in situations where the unique_ptr encounters issues with incomplete types. Let's delve into this exception and learn when it's necessary to provide an empty destructor.

When an Empty Destructor is Required

by Andreas Fertig

From the article:

As you probably know from life, not only programming. There is no rule without an exception. Let's talk about the one case that requires an empty destructor (yes, I know it sounds silly). Suppose you have the following code:

In file included from <source>:2:
In file included from /opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/memory:76:
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/bits/unique_ptr.h:93:16: error: invalid application of 'sizeof' to an incomplete type 'Orange'
        static_assert(sizeof(_Tp)>0,
                      ^~~~~~~~~~~
/opt/compiler-explorer/gcc-12.2.0/lib/gcc/x86_64-linux-gnu/12.2.0/../../../../include/c++/12.2.0/bits/unique_ptr.h:396:4: note: in instantiation of member function 'std::default_delete<Orange>::operator()' requested here
          get_deleter()(std::move(__ptr));
          ^
<source>:4:7: note: in instantiation of member function 'std::unique_ptr<Orange>::~unique_ptr' requested here
class Apple
      ^
<source>:6:27: note: forward declaration of 'Orange'
    std::unique_ptr<class Orange> mOrange{};
                          ^
1 error generated.
Compiler returned: 1
 
Essentially, this message tells you that the std::unique_ptr cannot instantiate the required destructor for itself typed with Orange. The simple reason is that, at this point, Orange has no visible destructor. Which is the entire point of the PImpl idiom. What now?