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
- 2014-09 π C++14 IS Editor's report
C++17
- 2014-10 Working draft Editor's report
- 2014-11 Working draft Editor's report
- 2015-04 Working draft Editor's report
- 2015-05 Working draft Editor's report
- 2015-11 Working draft Editor's report
- 2016-03 Working draft Editor's report
- 2016-05 Working draft Editor's report
- 2016-07 π C++17 CD Working draft Editor's report
- 2016-11 Working draft Editor's report
- 2017-02 Working draft Editor's report
- 2017-03 π C++17 DIS Working draft Editor's report
C++20
- 2017-07 Working draft Editor's report
- 2017-10 Working draft Editor's report
- 2017-11 Working draft Editors' report
- 2018-02 Working draft Editors' report
- 2018-04 Working draft Editors' report
- 2018-05 Working draft Editors' report
- 2018-07 Working draft Editors' report
- 2018-10 Working draft Editors' report
- 2018-11 Working draft Editors' report
- 2019-01 Working draft Editors' report
- 2019-03 Working draft Editors' report
- 2019-06 Working draft Editors' report
- 2019-08 π C++20 CD Editors' report
- 2019-10 Working draft Editors' report
- 2019-11 Working draft Editors' report
- 2020-01 Working draft Editors' report
- 2020-04 π C++20 DIS Working draft Editors' report
Post-C++20
- 2020-10 Working draft Editors' report
- 2020-12 Editors' report
C++ Committee Papers
2011
2012
2013
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
- 2015-04 Inline Variables (with Hal Finkel) N4424 P0386R0 P0386R2
- 2015-04 Rewording inheriting constructors (core issue 1941 et al) N4429 P0136R0 P0136R1
- 2015-04 Core Issue 1776: Replacement of class objects containing reference members N4430 P0137R0 P0137R1
- 2015-05 Feature-testing preprocessor predicates for C++17 (with Clark Nelson) N4535
- 2015-09 Introducing a name for brace-or-equal-initializers for non-static data members P0134R0
- 2015-09 Template argument deduction for class templates (Rev. 7) (with Mike Spertus, Faisal Vali) P0091R0 P0091R1 P0091R2 P0091R3 P0091R4
- 2015-09 guaranteed copy elision through simplified value categories P0135R0 P0135R1
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
- 2017-02 Concepts TS revisited (with James Dennett) P0587R0
- 2017-02 Simplifying implicit lambda capture P0588R0 P0588R1
- 2017-06 Unified concept definition syntax (with Andrew Sutton) P0716R0
- 2017-06 Semantic constraint matching for concepts (with Andrew Sutton) P0717R0 P0717R1
- 2017-06 Efficient sized delete for variable sized classes (with Andrew Hunter) P0722R0 P0722R1 P0722R2 P0722R3
- 2017-10 More constexpr containers (with Daveed Vandevoorde, Peter Dimov, Louis Dionne, Nina Ranns, Daveed Vandevoorde) P0784R0 P0784R1 P0784R3 P0784R2 P0784R4 P0784R5 P0784R6 P0784R7
- 2017-10 Implicit creation of objects for low-level object manipulation (with Ville Voutilainen) P0593R1 P0593R2 P0593R3 P0593R4 P0593R5 P0593R6
- 2017-10 Recursive Lambdas P0839R0
- 2017-10 Language support for empty objects P0840R0 P0840R1 P0840R2
- 2017-11 Core Issue 1581: When are constexpr member functions defined? P0859R0
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
- 2019-02 Constrained Internal Linkage for Modules (with Chandler Carruth, Nathan Sidwell) P1498R0 P1498R1
- 2019-03 Standard library header units for C++20 P1502R0 P1502R1
- 2019-06 Mitigating minor modules maladies P1766R0 P1766R1
- 2019-06 Packaging C++ Modules P1767R0
- 2019-07 Permit conversions to arrays of unknown bound (with Robert Haberlach) P0388R4
- 2019-08 Relaxing redefinition restrictions for re-exportation robustness (with Gabriel Dos Reis) P1811R0
- 2019-10 if consteval (with Barry Revzin, Daveed Vandevoorde, Andrew Sutton) P1938R0 P1938R1 P1938R2 P1938R3
- 2019-12 Defaulted comparison specification cleanups P2002R0 P2002R1
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
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
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
- Most Underhanded C++ Contest 2018 (Results & Analysis)
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;