C++ Standardization and Development

I have been heavily involved in the evolution of C++, both in compiler implementation and standardization as a member of WG21.

Table of Contents

Editors' Reports & Working Drafts

I was Project Editor for the ISO C++17 (ISO/IEC 14882:2017) and C++20 (ISO/IEC 14882:2020) standards.

C++14

C++17

C++20

Post-C++20

C++ Committee Papers

2011

  • 2011-09 Issues Found Implementing C++0x (with S. Hunt, S. Redl, D. Majnemer) N3307
  • 2011-09 constexpr consternation (with D. Gregor) N3308

2012

2013

  • 2013-03 Literal operator templates for strings N3599
  • 2013-04 Member initializers and aggregates (with V. Voutilainen) N3653
  • 2013-04 Clarifying Memory Allocation (with L. Crowl, C. Carruth) N3664
  • 2013-09 Single-Quotation-Mark as a Digit Separator (with L. Crowl, J. Snyder, D. Vandevoorde) N3781

2014

  • 2014-05 Removing trigraphs??! N3981 N4086
  • 2014-05 Exploring classes of runtime size (with J. Snyder) N4025
  • 2014-05 Allow typename in a template template parameter N4051
  • 2014-10 Attributes for namespaces and enumerators N4196 N4266
  • 2014-10 Adding u8 character literals N4197 N4267
  • 2014-10 Allow constant evaluation for all non-type template arguments N4198 N4268
  • 2014-10 Folding Expressions (with Andrew Sutton) N4191 N4295
  • 2014-11 Pointer Safety and Placement New (with Hubert Tong) N4303

2015

2016

  • 2016-02 Proposed modules changes from implementation and deployment experience (with Chandler Carruth, David Jones) P0273R0 P0273R1
  • 2016-02 Synopses for the C library (with Thomas Koeppe) P0175R0 P0175R1
  • 2016-02 std::direct_init<T> for plugging the metaprogramming constructor hole (with Tony Van Eerd, David Sankel) P0271R0
  • 2016-03 Coroutines: Language and Implementation Impact (with Daveed Vandevoorde, Geoffrey Romer, Gor Nishanov, Nathan Sidwell, Iain Sandoe, Lewis Baker) P0057R3 P1492R0
  • 2016-05 Designated Initialization (with Tim Shen) P0329R0 P0329R1 P0329R2 P0329R3 P0329R4
  • 2016-11 Pack expansions in using-declarations (with Robert Haberlach) P0195R2
  • 2016-11 Class Template Argument Deduction Assorted NB resolution and issues (with Mike Spertus, Faisal Vali) P0512R0
  • 2016-11 Wording changes for proposed Modules TS extensions P0529R0

2017

2018

  • 2018-01 Symmetry for spaceship (with Tomasz KamiΕ„ski, Herb Sutter) P0905R0 P0905R1
  • 2018-02 Generalizing alias declarations P0945R0
  • 2018-02 Towards consistency between <=> and other comparison operators P0946R0
  • 2018-02 Bind Returned/Initialized Objects to the Lifetime of Parameters (with Nicolai Josuttis) P0936R0
  • 2018-02 Another take on Modules P0947R0 P0947R1
  • 2018-03 Comparison of Modules Proposals (with David Jones) P0986R0
  • 2018-03 Halo: coroutine Heap Allocation eLision Optimization: the joint response (with Gor Nishanov) P0981R0
  • 2018-04 Plan of Record for Making C++ Modules Available in C++ Standards (with Gabriel Dos Reis) P0983R0
  • 2018-05 std::is_constant_evaluated (with Andrew Sutton, Daveed Vandevoorde) P0595R1 P0595R2
  • 2018-05 Immediate functions (with Andrew Sutton, Daveed Vandevoorde) P1073R0 P1073R1 P1073R2 P1073R3
  • 2018-05 Prohibit aggregates with user-declared constructors (with Timur Doumler, Arthur O’Dwyer, Howard E. Hinnant, Nicolai Josuttis) P1008R0 P1008R1
  • 2018-05 Modules for Standard C++ (with Gabriel Dos Reis) P1087R0
  • 2018-06 Consistency improvements for <=> and other comparison operators P1120R0
  • 2018-06 Merging Modules P1103R0 P1103R1 P1103R2 P1103R3
  • 2018-09 Response to P1156 P1180R0
  • 2018-10 Modular main() (with Boris Kolpackov) P1203R0
  • 2018-10 Contra CWG DR1778 P1286R0 P1286R1 P1286R2
  • 2018-10 Filling holes in Class Template Argument Deduction (with Mike Spertus, Timur Doumler) P1021R1 P1021R2 P1021R3 P1021R4 P1021R5 P1021R6
  • 2018-10 Implicit Module Partition Lookup (with Isabella Muerte) P1302R0 P1302R1
  • 2018-11 Allowing dynamic_cast, polymorphic typeid in Constant Expressions (with Peter Dimov, Vassil Vassilev) P1327R1
  • 2018-11 Yet another approach for constrained declarations (with Ville Voutilainen, Thomas KΓΆppe, Andrew Sutton, Herb Sutter, Gabriel Dos Reis, Bjarne Stroustrup, Jason Merrill, Hubert Tong, Eric Niebler, Casey Carter, Tom Honermann, Erich Keane, Walter E. Brown, Michael Spertus) P1141R2
  • 2018-12 Single-file modules with the Atom semantic properties rule (with Jeff Snyder) P1242R1

2019

2020

  • 2020-03 Goals and priorities for C++ (with Chandler Carruth, Timothy Costa, Hal Finkel, Dmitri Gribenko, D. S. Hollman, Chris Kennelly, Thomas KΓΆppe, Damien Lebrun-Grandie, Bryce Adelstein Lelbach, Josh Levenberg, Nevin Liber, Chris Palmer, Tom Scogland, David Stone, Christian Trott, Titus Winters) P2137R0

2021

  • 2021-10 The Equality Operator You Are Looking For (with Barry Revzin, Bjarne Stroustrup, Cameron DaCamara, Daveed Vandevoorde, Gabriel Dos Reis, Herb Sutter, Jason Merrill, Jonathan Caves, Ville Voutilainen) P2468R0 P2468R1 P2468R2
  • 2021-11 Extending class types as non-type template parameters (with Barry Revzin) P2484R0

2022

Complete WG21 Document Archive →

Issues

Issues I've submitted to the C++ committee.

CWG

CWG331 CWG1346 CWG1347 CWG1348 CWG1349 CWG1351 CWG1352 CWG1357 CWG1358 CWG1359 CWG1360 CWG1361 CWG1362 CWG1405 CWG1406 CWG1407 CWG1413 CWG1415 CWG1420 CWG1436 CWG1439 CWG1449 CWG1450 CWG1452 CWG1453 CWG1454 CWG1455 CWG1456 CWG1458 CWG1472 CWG1473 CWG1474 CWG1485 CWG1487 CWG1488 CWG1491 CWG1502 CWG1510 CWG1511 CWG1518 CWG1528 CWG1535 CWG1551 CWG1553 CWG1562 CWG1581 CWG1590 CWG1592 CWG1593 CWG1594 CWG1598 CWG1602 CWG1603 CWG1610 CWG1614 CWG1615 CWG1617 CWG1627 CWG1628 CWG1634 CWG1635 CWG1638 CWG1640 CWG1644 CWG1645 CWG1648 CWG1651 CWG1652 CWG1654 CWG1657 CWG1658 CWG1659 CWG1660 CWG1665 CWG1669 CWG1670 CWG1672 CWG1674 CWG1676 CWG1680 CWG1681 CWG1684 CWG1687 CWG1689 CWG1693 CWG1694 CWG1695 CWG1696 CWG1697 CWG1702 CWG1703 CWG1704 CWG1707 CWG1708 CWG1710 CWG1711 CWG1712 CWG1713 CWG1717 CWG1725 CWG1732 CWG1737 CWG1740 CWG1741 CWG1742 CWG1744 CWG1754 CWG1755 CWG1756 CWG1757 CWG1758 CWG1777 CWG1788 CWG1795 CWG1799 CWG1800 CWG1805 CWG1806 CWG1808 CWG1809 CWG1811 CWG1817 CWG1818 CWG1819 CWG1820 CWG1821 CWG1823 CWG1828 CWG1832 CWG1833 CWG1834 CWG1835 CWG1838 CWG1840 CWG1843 CWG1844 CWG1845 CWG1846 CWG1848 CWG1849 CWG1850 CWG1854 CWG1856 CWG1858 CWG1859 CWG1862 CWG1867 CWG1869 CWG1871 CWG1872 CWG1873 CWG1874 CWG1875 CWG1879 CWG1884 CWG1886 CWG1892 CWG1893 CWG1894 CWG1895 CWG1899 CWG1901 CWG1902 CWG1903 CWG1906 CWG1907 CWG1909 CWG1910 CWG1911 CWG1916 CWG1918 CWG1923 CWG1925 CWG1928 CWG1930 CWG1932 CWG1936 CWG1937 CWG1938 CWG1939 CWG1940 CWG1945 CWG1949 CWG1950 CWG1951 CWG1963 CWG1965 CWG1967 CWG1968 CWG1969 CWG1970 CWG1972 CWG1975 CWG1976 CWG1980 CWG1981 CWG1983 CWG1986 CWG1987 CWG1988 CWG1989 CWG1993 CWG1994 CWG1996 CWG1999 CWG2000 CWG2001 CWG2002 CWG2003 CWG2004 CWG2006 CWG2007 CWG2009 CWG2010 CWG2014 CWG2017 CWG2018 CWG2020 CWG2021 CWG2024 CWG2025 CWG2037 CWG2039 CWG2042 CWG2043 CWG2044 CWG2047 CWG2048 CWG2051 CWG2052 CWG2056 CWG2058 CWG2059 CWG2061 CWG2064 CWG2065 CWG2066 CWG2067 CWG2068 CWG2069 CWG2070 CWG2071 CWG2074 CWG2075 CWG2076 CWG2077 CWG2078 CWG2088 CWG2091 CWG2099 CWG2100 CWG2102 CWG2103 CWG2112 CWG2113 CWG2115 CWG2116 CWG2118 CWG2126 CWG2128 CWG2130 CWG2131 CWG2133 CWG2137 CWG2138 CWG2140 CWG2144 CWG2145 CWG2153 CWG2154 CWG2155 CWG2156 CWG2157 CWG2158 CWG2159 CWG2160 CWG2163 CWG2164 CWG2165 CWG2167 CWG2172 CWG2174 CWG2176 CWG2177 CWG2178 CWG2196 CWG2198 CWG2199 CWG2202 CWG2205 CWG2207 CWG2212 CWG2213 CWG2214 CWG2215 CWG2218 CWG2219 CWG2226 CWG2227 CWG2228 CWG2233 CWG2234 CWG2235 CWG2244 CWG2245 CWG2248 CWG2251 CWG2252 CWG2254 CWG2256 CWG2258 CWG2259 CWG2260 CWG2262 CWG2267 CWG2268 CWG2270 CWG2271 CWG2273 CWG2274 CWG2277 CWG2278 CWG2279 CWG2280 CWG2281 CWG2282 CWG2283 CWG2284 CWG2285 CWG2287 CWG2289 CWG2294 CWG2307 CWG2308 CWG2310 CWG2311 CWG2312 CWG2313 CWG2314 CWG2315 CWG2317 CWG2319 CWG2320 CWG2321 CWG2327 CWG2328 CWG2337 CWG2342 CWG2352 CWG2353 CWG2356 CWG2367 CWG2368 CWG2373 CWG2379 CWG2380 CWG2390 CWG2391 CWG2394 CWG2395 CWG2396 CWG2402 CWG2418 CWG2424 CWG2432 CWG2433 CWG2434 CWG2437 CWG2438 CWG2457 CWG2467 CWG2480 CWG2482 CWG2484 CWG2485 CWG2487 CWG2491 CWG2497 CWG2513 CWG2517 CWG2539 CWG2540 CWG2545 CWG2549 CWG2591 CWG2598 CWG2601 CWG2606 CWG2607 CWG2611 CWG2661 CWG2665 CWG2667 CWG2672 CWG2676 CWG2677 CWG2678 CWG2700 CWG2701 CWG2702 CWG2703 CWG2707 CWG2713 CWG2714 CWG2720 CWG2721 CWG2725 CWG2740 CWG2741 CWG2751 CWG2759 CWG2769 CWG2770 CWG2802 CWG2804 CWG2808 CWG2852 CWG2863 CWG2867 CWG2868 CWG2869 CWG2875 CWG2876 CWG2877 CWG2881 CWG2882 CWG2903 CWG2913 CWG2916 CWG2918 CWG2936 CWG2952 CWG2969 CWG2979 CWG2982 CWG2983 CWG2998 CWG2999 CWG3006 CWG3010 CWG3019 CWG3052 CWG3064 CWG3128
All CWG Issues →

EWG

EWG25 EWG66 EWG69 EWG113 EWG118 EWG119 EWG121 EWG125 EWG131 EWG132 EWG142 EWG154 EWG155 EWG180
All EWG Issues →

LWG

LWG2129 LWG2193 LWG2225 LWG2241 LWG2259 LWG2358 LWG2363 LWG2380 LWG2394 LWG2396 LWG2425 LWG2453 LWG2456 LWG2458 LWG2460 LWG2472 LWG2498 LWG2499 LWG2536 LWG2548 LWG2560 LWG2678 LWG2709 LWG2729 LWG2730 LWG2733 LWG2742 LWG2743 LWG2746 LWG2765 LWG2770 LWG2816 LWG2825 LWG2827 LWG2829 LWG2833 LWG2972 LWG3005 LWG3059 LWG3061 LWG3090 LWG3091 LWG3093 LWG3094 LWG3242 LWG3243 LWG3246 LWG3248 LWG3250 LWG3251 LWG3337 LWG3342 LWG3346 LWG3419 LWG3521
All LWG Issues →

Technical Talks

CppCon 2016: There and Back Again: An Incremental C++ Modules Design

CppNow 2023: Writing a Lookup Table in C++ (Lightning Talk)

Trivia

The C++ Contest 2018

Twitter Quizzes

  • Quiz Quick C++20 quiz: Which numbered lines are valid?
    struct A { int x, y; };
    void f(A (&&)[]);
    void g() {
        f({1, 2, 3, 4, 5, 6}); // #1
        (&f)({1, 2, 3, 4, 5, 6}); // #2
        (*f)({1, 2, 3, 4, 5, 6}); // #3
    }
  • Quiz Quick C++ quiz: which of these is valid?
    struct T {};
    T *get(int);
    void f() {
        if (T *p = get(0)) { /*...*/ }
        else if (T *p = get(1)) { /*...*/ }
    }
    void g() {
        if (T *p = get(0)) { /*...*/ }
        else { T *p = get(1); /*...*/ }
    }
  • Quiz Quick C++ quiz: what does this do?
    #include <stdio.h>
    void f(float&&) { puts("float"); }
    void f(int&&) { puts("int"); }
    void g(auto &&...v) { (f(v), ...); }
    int main() { g(1.0f, 2); }
  • Quiz C++ quiz: which of these are valid in C++20?
    const char (&&r1)[3] = {"abc"};
    const char (&&r2)[4] = {"abc"};
    const char (&&r3)[5] = {"abc"};
    const char (&&r4)[] = {"abc"};
  • Quiz C++ quiz: what's the value of 'n' after this? (Assume 8-bit char, 32-bit int.)
    unsigned char n = 1;
    n = n << 8;
  • Quiz C++ quiz: what happens if you call this function?
    void f() {
        int a[1];
        int *p = a;
        delete p;
    }
  • Quiz C++ quiz: can an auto& reference bind to a temporary when the initializer is an lvalue?
    struct A { /*???*/ } a;
    auto &r = a.n; // can bind to a temporary?
  • Quiz C++ quiz time! Assuming long long is 64 bits and double is IEEE754 double precision, what happens here:
    long long n = 0x7fff'ffff'ffff'ffff;
    double d = n;
    long long m = d;
  • Quiz Quick C++ quiz:
    int n=0x1e+2>>4;
  • Quiz C++ quiz time! Without checking, what does this print (assume an LP64 / LLP64 system):
    short a = 1;
    std::cout << sizeof(+a)["23456"] << std::endl;