The status of reflection in C++—Axel Naumann

Axel Naumann writes about the state of the reflection in C++ in his recent article.

The status of reflection of C++

by Axel Naumann

From the article:

When the C++ committee met in Jacksonville two months ago, something big happened: the reflection study group, SG7, decided what the basic “language" of reflected C++ should look like. What does that mean? Why do you care? Let me, the co-author of the only “blessed proposal", explain...

N4590: PL22.16/WG21 draft agenda: 20-25 Jun 2016, Oulu, FI—Clark Nelson

A new WG21 paper is available. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: N4590

Date: 2016-04-07

PL22.16/WG21 draft agenda: 20-25 Jun 2016, Oulu, FI

by Clark Nelson


Meeting objectives The primary goals of this meeting will be:

  • Approve a CD for C++17
  • Advance Library Fundamentals v2 toward TS
  • Advance Networking toward PDTS
  • Advance Parallelism v2 toward PDTS
  • Advance Ranges toward PDTS

2016-03 Post-Jacksonville mailing available

The 2016-03 mailing of new standards papers is now available.

NOTE: A number of these papers have already been publicized on this blog. This is the complete list including ones not previously publicized.


2016-03 post-Jacksonville
N4578 Working Draft, Technical Specification for C++ Extensions for Parallelism Version 2 Jared Hoberock 2016-02-22 2016-03 N4505    
N4579 Parallelism TS Editor's Report, pre-Jacksonville mailing Jared Hoberock 2016-02-22 2016-03      
N4580 WG21 2016-02-19 Telecon Minutes Jonathan Wakely 2016-02-23 2016-03      
N4581 Revised WG21 2016-02-19 Telecon Minutes Jonathan Wakely 2016-02-29 2016-03      
N4582 Working Draft, Standard for Programming Language C++ Richard Smith 2016-03-19 2016-03 N4567    
N4583 Editor's Report -- Working Draft, Standard for Programming Language C++ Richard Smith 2016-03-18 2016-03      
N4584 Working Draft, C++ Extensions for Library Fundamentals, Version 2 Geoffrey Romer 2016-03-08 2016-03 N4562    
N4585 Editor's Report for the Library Fundamentals TS Geoffrey Romer 2016-03-08 2016-03      
N4586 WG21 2016-02 Jacksonville Min Jonathan Wakely 2016-03-30 2016-03      
N4587 PL22.16 2016-02 Jacksonville Minutes (Draft) Jonathan Wakely 2016-03-30 2016-03      
N4588 Working Draft, C++ extensions for Networking Note: Jonathan Wakely 2016-03-21 2016-03 N4575    
N4589 Networking TS Editor's Report Jonathan Wakely 2016-03-20 2016-03      
P0003R2 Removing Deprecated Dynamic Exception Specifications from C++17 Alisdair Meredith 2016-03-20 2016-03 P0003R1 Core  
P0005R4 Adopt not_fn from Library Fundamentals 2 for C++17 Alisdair Meredith 2016-03-01 2016-03 P0005R3 Library Adopted 2016-02
P0018R3 Lambda Capture of *this by Value as [=,*this] H. Carter Edwards, Daveed Vandevoorde, Christian Trott, Hal Finkel, Jim Reus, Robin Maffeo, Ben Sander 2016-03-04 2016-03 P0018R2 Evolution, Core Adopted 2016-02
P0019R2 Atomic View H. Carter Edwards, Hans Boehm, Olivier Giroux, James Reus 2016-03-14 2016-03 P0019R1 Concurrency  
P0020R2 Floating Point Atomic H. Carter Edwards, Hans Boehm, Olivier Giroux, JF Bastien, James Reus 2016-03-14 2016-03 P0020R1 Concurrency, Library Evolution  
P0024R2 The Parallelism TS Should be Standardized Jared Hoberock 2016-03-04 2016-03 P0024R1 Concurrency Adopted 2016-02
P0028R2 Using non-standard attributes J. Daniel Garcia, Luis M. Sanchez, Massimo Torquati, Marco Danelutto, Peter Sommerlad 2016-03-15 2016-03 P0028R1 Evolution  
P0028R3 Using non-standard attributes J. Daniel Garcia, Daveed Vandevoorde 2016-03-15 2016-03 P0028R2 Evolution  
P0035R2 Dynamic memory allocation for over-aligned data Clark Nelson 2016-03-18 2016-03 P0035R1 Evolution  
P0052R2 Generic Scope Guard and RAII Wrapper for the Standard Library Peter Sommerlad, Andrew L. Sandoval 2016-03-18 2016-03 P0052R1 Library, Library Evolution  
P0057R3 Wording for Coroutines Gor Nishanov, Jens Maurer, Richard Smith, Daveed Vandevoorde 2016-03-20 2016-03 P0057R2 Core, Evolution  
P0063R2 C++17 should refer to C11 instead of C99 Hans Boehm 2016-03-18 2016-03 P0063R1 Library Evolution  
P0077R2 is_callable, the missing INVOKE related trai Agustín Bergé 2016-03-03 2016-03 P0077R1 Library Adopted 2016-02
P0083R2 Splicing Maps and Sets (Revision 4) Alan Talbot, Jonathan Wakely, Howard Hinnant, James Dennett 2016-03-20 2016-03 P0083R1 Library  
P0088R2 Variant: a type-safe union for C++17 (v7) Axel Naumann 2016-03-21 2016-03 P0088R1 Library  
P0096R2 Feature-testing recommendations for C++ Clark Nelson 2016-02-23 2016-03 P0096R1 Feature Testing  
P0126R2 std::synchronic<T> Olivier Giroux, Torvald Riegel 2016-03-13 2016-03 P0126R1 Concurrency  
P0127R1 Declaring non-type template arguments with auto James Touton, Mike Spertus 2016-03-04 2016-03 P0127R0 Evolution  
P0138R2 Construction Rules for enum class Values Gabriel Dos Reis 2016-03-04 2016-03 P0138R1 WG21 Adopted 2016-02
P0143R2 Wording for Modules Gabriel Dos Reis 2016-03-04 2016-03 P0143R1 Core Adopted 2016-02
P0144R2 Structured Bindings Herb Sutter 2016-03-16 2016-03 P0144R1 Evolution  
P0152R1 constexpr atomic<T>::is_always_lock_free Olivier Giroux, JF Bastien, Jeff Snyder 2016-03-02 2016-03 P0152R0 Concurrency Adopted 2016-02
P0154R1 constexpr std::thread::hardware_{true,false}_sharing_size JF Bastien, Olivier Giroux 2016-03-03 2016-03 P0154R0 Concurrency Adopted 2016-02
P0167R2 Core Language Working Group "ready" Issues for the February, 2016 (Jacksonville) meeting William M. Miller 2016-03-04 2016-03 P0167R1 WG21 Adopted 2016-02
P0170R1 Wording for Constexpr Lambda Faisal Vali 2016-03-01 2016-03 P0170R0 Core  
P0174R1 Deprecating Vestigial Library Parts in C++17 Alisdair Meredith 2016-03-21 2016-03 P0174R0 Library Evolution  
P0177R1 Cleaning up allocator_traits Alisdair Meredith 2016-03-01 2016-03 P0177R0 Library Evolution  
P0177R2 Cleaning up allocator_traits Alisdair Meredith 2016-03-21 2016-03 P0177R1 Library Evolution  
P0180R1 Reserve a New Library Namespace Future Standardization Alisdair Meredith 2016-03-21 2016-03 P0180R0 Library Evolution  
P0185R1 Adding [nothrow-]swappable traits, revision 3 Daniel Krugler 2016-03-01 2016-03 P0185R0 Library Adopted 2016-02
P0188R1 Wording for [[fallthrough]] attribute Andrew Tomazos 2016-02-29 2016-03 P0188R0 Core Adopted 2016-02
P0189R1 Wording for [[nodiscard]] attribute Andrew Tomazos 2016-02-29 2016-03 P0189R0 Core Adopted 2016-02
P0190R1 Proposal for New memory order consume Definition Paul E. McKenney, Michael Wong, Hans Boehm, Jens Maurer 2016-03-18 2016-03 P0190R0 Concurrency  
P0191R1 C++ virtual member function pointer comparison Daniel Markus 2016-03-20 2016-03 P0191R0 Evolution  
P0193R1 Where is Vectorization in C++‽ JF Bastien, Hans Boehm 2016-03-20 2016-03 P0193R0 Concurrency, SG14  
P0206R1 A joining thread Ville Voutilainen 2016-03-09 2016-03 P0206R0 Concurrency, Library Evolution  
P0212R1 Wording for [[maybe_unused]] attribute Andrew Tomazos 2016-03-01 2016-03 P0212R0 Evolution Adopted 2016-02
P0217R1 Proposed wording for structured bindings Jens Maurer 2016-03-20 2016-03 P0217R0 Evolution, Core  
P0218R1 Adopt File System TS for C++17 Beman Dawes 2016-03-05 2016-03 P0218R0 Library, File System  
P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1) Beman Dawes 2016-03-03 2016-03 P0220R0 Library, Library Evolution  
P0221R1 Proposed wording for default comparisons, revision 3 Jens Maurer 2016-03-17 2016-03 P0221R0 Core  
P0226R1 Mathematical Special Functions for C++17, v5 Walter E. Brown, Axel Naumann, Edward Smith-Rowland 2016-02-29 2016-03 P0226R0 Library, Library Evolution Adopted 2016-02
P0244R1 Text_view: A C++ concepts and range based character encoding and code point enumeration library Tom Honermann 2016-03-20 2016-03 P0244R0 Library Evolution  
P0245R1 Hexadecimal float literals for C++ Thomas Koeppe 2016-03-04 2016-03 P0245R0 Evolution, Core Adopted 2016-02
P0250R1 Wording improvements for initialization and thread ids (CWG 2046) Hans Boehm 2016-03-20 2016-03 P0250R0 Concurrency, Core  
P0253R1 Fixing a design mistake in the searchers interface in Library Fundamentals Marshal Clow 2016-03-01 2016-03 P0253R0 Library Evolution Adopted 2016-02
P0254R0 Integrating std::string_view and std::string Marshal Clow 2016-03-20 2016-03   Library Evolution  
P0258R1 is_contiguous_layout Michael Spencer 2016-03-05 2016-03 P0258R0 Library, Core  
P0263R1 Core Language Working Group "tentatively ready" Issues for the February, 2016 (Jacksonville) Meeting William M. Miller 2016-03-04 2016-03 P0263R0 WG21 Adopted 2016-02
P0267R1 A Proposal to Add 2D Graphics Rendering and Display to C++, Michael McLaughlin, Herb Sutter, Jason Zink 2016-03-21 2016-03 P0267R0 Library Evolution  
P0272R1 Give 'std::string' a non-const '.data()' member function David Sankel 2016-03-04 2016-03 P0272R0 Library Evolution Adopted 2016-02
P0275R0 A Proposal to add Classes and Functions Required for Dynamic Library Load Antony Polukhin 2016-03-20 2016-03   Library Evolution  
P0276R0 A Proposal to add Attribute [[visible]] Antony Polukhin 2016-03-20 2016-03   Evolution, Core  
P0277R1 const Inheritance David Wilson 2016-02-22 2016-03 P0277R0 Evolution  
P0283R1 Standard and non-standard attributes J. Daniel Garcia 2016-03-15 2016-03 P0283R0 Core  
P0290R0 apply() for synchronized_value<T> Anthony Williams 2016-02-19 2016-03   Concurrency  
P0292R0 constexpr if: A slightly different syntax Jens Maurer 2016-03-17 2016-03   Core  
P0295R0 Adopt Selected Library Fundamentals V2 Components for C++17 Walter E. Brown 2016-03-01 2016-03   Library Evolution, Library  
P0296R0 Forward progress guarantees: Base definitions Torvald Riegel 2016-03-05 2016-03   Core  
P0299R0 Forward progress guarantees for the Parallelism TS v2 Torvald Riegel 2016-03-05 2016-03   Library  
P0301R0 Wording for Unified Call Syntax Jens Maurer 2016-03-04 2016-03   Core  
P0301R1 Wording for Unified Call Syntax (revision 1) Jens Maurer 2016-03-21 2016-03 P0301R0 Evolution  
P0302R0 Deprecating Allocator Support in std::function Jonathan Wakely 2016-03-18 2016-03   Library  
P0304R0 C++ Standard Library Issues Resolved Directly In Jacksonville Marshal Clow 2016-03-04 2016-03   Library Adopted 2016-02
P0305R0 If statement with initializer Thomas Koeppe 2016-03-14 2016-03   Evolution, Core  
P0306R0 Comma elision and comma deletion Thomas Koeppe 2016-03-17 2016-03   Evolution, Core, WG14 liason  
P0308R0 Valueless Variants Considered Harmful Peter Dimov 2016-03-16 2016-03   Library Evolution, Library  
P0309R0 Partial class Daniele Bordes, Markus Hosch 2016-03-17 2016-03   Evolution  
P0310R0 Splitting node and array allocation in allocators Marcelo Zimbres 2016-03-19 2016-03   Library Evolution  
P0311R0 A Unified Vision for Manipulating Tuple-like Objects Matthew Woehlke 2016-03-18 2016-03   Evolution  
P0312R0 Make Pointers to Members Callable Barry Revzin 2016-03-20 2016-03   Evolution  
P0313R0 Comparison operators in fold-expressions Ville Voutilainen 2016-03-21 2016-03   Evolution  


PO4116r0: Completing support for emotive programming in C++—Pablo Halpern

A new WG21 paper is available. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: PO4116r0

Date: 2016-04-01

Completing support for emotive programming in C++

by Pablo Halpern


There can be no doubt that C++ is an unusually expressive language. A significant part of that expressiveness comes from the ability to use emoticons, not just in comments and string literals, but in the code itself. For example the following (do-nothing) program compiles, links, and runs in all versions of C++: ...

P3141: std::terminates()

A new WG21 paper is available.

Document number: P3141

Date: 2016-04-01


by Hal T. Ng, Professor, C.S.,


In 2014, the C++ committee tackled the problem of C++98's subtly hard-to-use std::uncaught_exception(), which was intended to return whether there were unhandled exceptions but did not work as intended in all destructor cases. The committee successfully addressed the problem by providing the improved std::uncaught_exceptions() (note plural "s"), which returns the number of unhandled exceptions in the current thread, and this function can now be used to reliably implement scope_guard and similar patterns in portable code.

Continuing in the same vein, this paper proposes to address C++98's related and sometimes-problematic std::terminate(). As its name suggests, the function causes abrupt program halts, which can cause data corruption if operations in flight are not completed gracefully. The set_terminate_handler() facility only partly addresses this problem by allowing a last-ditch handler to be invoked after unstoppable termination has already begun.

Along the same lines as conditional noexcept (noexcept(cond)), we propose a way for a sensitive operation, or a whole program, to determine in advance whether termination is possible. A program can test this by calling:

namespace std {
    bool terminates();

which returns true if and only if the program can subsequently terminate.

Because this function cannot fail to determine a valid result, it should be noexcept. Further, anticipating its usefulness in constant expressions and following LWG’s guidance for using constexpr wherever possible throughout the standard library, we propose in full:

namespace std {
    constexpr bool terminates() noexcept;

Implementation notes: This function is so simple to specify that we foresee no implementation difficulty in any of the major C++ compilers.

Note that this is not the same as the halting problem, which would be to return true if and only if the program will halt, and which is known to take several hours to compute for programs longer than a few tens of millions of lines. Rather, this function is carefully constructed to return true if and only if the program could terminate, which is fundamentally different and well understood problem.

Acknowledgments: This paper expands on the core idea that was first proposed in committee hallway discussion by P.J. Plauger.

Trip Report: C++ Standards Meeting in Jacksonville, February 2016—Botond Ballo

ANother trip report:

Trip Report: C++ Standards Meeting in Jacksonville, February 2016

by Botond Ballo

From the article:

Last week I attended a meeting of the ISO C++ Standards Committee in Jacksonville, Florida. This was the first committee meeting in 2016; you can find my reports on the 2015 meetings here (May 2015, Lenexa) and here (October 2015, Kona). These reports, particularly the Kona one, provide useful context for this post...

P0141R0: Modules, Componentization, and Transition by Gabriel Dos Reis and Pavel Curtis

A new WG21 paper is available. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: P0141R0

Date: 2015-10-05

Modules, Componentization, and Transition

by Gabriel Dos Reis and Pavel Curtis


We provide an analysis of constraints for a good, acceptable, and scalable module system for modern C++. This analysis is based on decades of practical experience with precompiled headers, and 40+ years of the include-file model, which has shown its limits. The paper also discusses several migration strategies. The end goal is to stimulate a technical discussion about the difficult choices we face in bringing C++’s compilation model into the era of semantics-aware developer tools, and of smart distributed and cloud build systems.

P0221R1: Proposed wording for default comparisons, revision 3—Jens Maurer

A new WG21 paper is available. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: P0221R1

Date: 2016-03-17

P0221R1: Proposed wording for default comparisons, revision 3

by Jens Maurer



This paper presents design rationale and proposed wording to implement default comparisons for class types. It is a revision of N4532 with additional updates from the Evolution Working Group session at the Kona meeting of WG21 and in-depth discussions with interested parties.

This paper assumes that the reader is familar with N4475 "Default comparisons (R2)" by Bjarne Stroustrup. In particular, default comparisons are assumed to be implicit (i.e. require no extra syntax to be available).

P0221R0 amended by a clarification for template specializations was approved by EWG during the Jacksonville (2016-03) meeting of WG21. Blue text in the proposed wording indicates changes compared to P0221R0.

Changes since P0221R0

  • fix wording glitches
  • clarified the zero-subobject (= empty class) cases
  • clarified that the context for a subobject comparison is the top-level class definition
  • clarified that both slicing copy and slicing move are prohibited
  • two-phase name lookup applies when comparing members whose type was instantiated from a dependent type

P0206R1: A joining thread—Ville Voutilainen

A new WG21 paper is available. If you are not a committee member, please use the comments section below or the std-proposals forum for public discussion.

Document number: P0206R1

Date: 2016-03-09

A joining thread

by Ville Voutilainen


Changes from previous version

  • This paper revises P0206R0.
  • Removed the motivation elaboration, it can be found in the previous revision.
  • Removed the discarded solutions.
  • Added explanation for the std::thread-accessing functions and discarded alternatives for it.
  • Renamed safe_thread to joining_thread.
  • Used thread::id and thread::native_handle_type in joining_thread.
  • Updated proposed wording.


C++ continues not to provide a thread type that would join() automatically on scope exit. This causes exception-safety problems, because failing to join() in all code paths causes the destructor of a std::thread to terminate(). This paper provides a solution that adds a new thread type that joins in its destructor, and is based on large-group and LEWG feedback given in Jacksonville. The proposal has been implemented and tested.