Editing

I was Project Editor for C++17 (ISO/IEC 14882:2017) and C++20 (ISO/IEC 14882:2020). These are the working drafts and editors’ reports from that time.

C++14 2014-09
C++14 IS N4141, members only Working draft N4140
2 documents
C++17 2014-10 – 2017-03
C++17 DIS N4660, members only Working draft N4659
24 documents
C++20 2017-07 – 2020-04
C++20 DIS N4860, members only Working draft N4861
35 documents
Post-C++20 2020-10 – 2020-12
3 documents

Papers73

Committee papers I wrote or co-wrote. The square shows which standard each one went into.

C++11 C++14 C++17 C++20 C++23 C++26 not adopted
2022 2 papers
  • Fixing std::start_lifetime_as and std::start_lifetime_as_array with Timur Doumler and 3 others R0R1P2679R2
  • Explicit lifetime management with Timur Doumler R0R1P2590R2
2021 2 papers
  • Extending class types as non-type template parameters with Barry Revzin P2484R0
  • The Equality Operator You Are Looking For with Barry Revzin and 8 others R0R1P2468R2
2020 1 paper
  • Goals and priorities for C++ with Chandler Carruth and 15 others P2137R0
2019 8 papers
  • Defaulted comparison specification cleanups R0P2002R1
  • if consteval with Barry Revzin and 2 others R0R1R2P1938R3
  • Relaxing redefinition restrictions for re-exportation robustness with Gabriel Dos Reis P1811R0
  • Permit conversions to arrays of unknown bound with Robert Haberlach P0388R4
  • Packaging C++ Modules P1767R0
  • Mitigating minor modules maladies R0P1766R1
  • Standard library header units for C++20 R0P1502R1
  • Constrained Internal Linkage for Modules with Chandler Carruth and Nathan Sidwell R0P1498R1(P1815R2)
2018 21 papers
  • Single-file modules with the Atom semantic properties rule with Jeff Snyder P1242R1
  • Yet another approach for constrained declarations with Ville Voutilainen and 13 others P1141R2
  • Allowing dynamic_cast, polymorphic typeid in Constant Expressions with Peter Dimov and Vassil Vassilev P1327R1
  • Implicit Module Partition Lookup with Isabella Muerte R0P1302R1
  • Filling holes in Class Template Argument Deduction with Mike Spertus and Timur Doumler R1R2R3R4R5P1021R6(P1816R0 P1814R0 P2082R1 P2582R1)
  • Contra CWG DR1778 R0R1P1286R2
  • Modular main() with Boris Kolpackov P1203R0
  • Response to P1156 P1180R0
  • Merging Modules with Gabriel Dos Reis R0R1R2P1103R3
  • Modules for Standard C++ with Gabriel Dos Reis P1087R0
  • Prohibit aggregates with user-declared constructors with Timur Doumler and 3 others R0P1008R1
  • Immediate functions with Andrew Sutton and Daveed Vandevoorde R0R1R2P1073R3
  • std::is_constant_evaluated with Andrew Sutton and Daveed Vandevoorde R1P0595R2
  • Plan of Record for Making C++ Modules Available in C++ Standards with Gabriel Dos Reis P0983R0
  • Halo: coroutine Heap Allocation eLision Optimization: the joint response with Gor Nishanov P0981R0
  • Comparison of Modules Proposals with David Jones P0986R0
  • Another take on Modules R0P0947R1
  • Bind Returned/Initialized Objects to the Lifetime of Parameters with Nicolai Josuttis P0936R0
  • Consistency improvements for <=> and other comparison operators P0946R0P1120R0
  • Generalizing alias declarations P0945R0
  • Symmetry for spaceship with Tomasz Kamiński and Herb Sutter R0P0905R1
2017 10 papers
  • Core Issue 1581: When are constexpr member functions defined? P0859R0
  • Language support for empty objects R0R1P0840R2
  • Recursive Lambdas P0839R0
  • Implicit creation of objects for low-level object manipulation with Ville Voutilainen R1R2R3R4R5P0593R6
  • More constexpr containers with Daveed Vandevoorde and 4 others R0R1R3R2R4R5R6P0784R7
  • Efficient sized delete for variable sized classes with Andrew Hunter R0R1R2P0722R3
  • Semantic constraint matching for concepts with Andrew Sutton R0P0717R1(P0734R0)
  • Unified concept definition syntax with Andrew Sutton P0716R0(P0734R0)
  • Simplifying implicit lambda capture R0P0588R1
  • Concepts TS revisited with James Dennett P0587R0
2016 8 papers
  • Wording changes for proposed Modules TS extensions P0529R0
  • Class Template Argument Deduction Assorted NB resolution and issues with Mike Spertus and Faisal Vali P0512R0
  • Pack expansions in using-declarations with Robert Haberlach P0195R2
  • Designated Initialization with Tim Shen R0R1R2R3P0329R4
  • Coroutines: Language and Implementation Impact with Daveed Vandevoorde and 5 others P0057R3P1492R0
  • std::direct_init<T> for plugging the metaprogramming constructor hole with Tony Van Eerd and David Sankel P0271R0
  • Synopses for the C library with Thomas Koeppe R0P0175R1
  • Proposed modules changes from implementation and deployment experience with Chandler Carruth and David Jones R0P0273R1
2015 6 papers
  • guaranteed copy elision through simplified value categories R0P0135R1
  • Template argument deduction for class templates (Rev. 7) with Mike Spertus and Faisal Vali R0R1R2R3P0091R4
  • Introducing a name for brace-or-equal-initializers for non-static data members P0134R0
  • __has_include for C++17 with Clark Nelson N4535R0P0061R1
  • Rewording inheriting constructors (core issue 1941 et al) N4429R0P0136R1
  • Inline Variables with Hal Finkel N4424R0P0386R2
2014 8 papers
  • Core Issue 1776: Replacement of class objects containing reference members N4303N4430R0P0137R1
  • Folding Expressions with Andrew Sutton N4191N4295
  • Allow constant evaluation for all non-type template arguments N4198N4268
  • Adding u8 character literals N4197N4267
  • Attributes for namespaces and enumerators N4196N4266
  • Allow typename in a template template parameter N4051
  • Exploring classes of runtime size with J. Snyder N4025
  • Removing trigraphs??! N3981N4086
2013 4 papers
  • Single-Quotation-Mark as a Digit Separator with L. Crowl and 2 others N3781
  • Clarifying Memory Allocation with L. Crowl and C. Carruth N3664
  • Member initializers and aggregates with V. Voutilainen N3653
  • Literal operator templates for strings N3599(P0732R2)
2012 1 paper
  • Relaxing constraints on constexpr functions / constexpr member functions and implicit const N3444N3598N3597N3652
2011 2 papers
  • constexpr consternation with D. Gregor N3308
  • Issues Found Implementing C++0x with S. Hunt and 2 others N3307
The complete WG21 paper archive ↗

Issues517

Issues I’ve reported against the standard, coloured by where they stand now.

resolved in progress open not a defect or duplicate
Core (CWG) · 448 all core issues ↗
308 resolved51 in progress44 open45 not a defect
400 more
1593159415981602160316101614161516171627162816341635163816401644164516481651165216541657165816591660166516691670167216741676168016811684168716891693169416951696169717021703170417071708171017111712171317171725173217371740174117421744175417551756175717581777178817951799180018051806180818091811181718181819182018211823182818321833183418351838184018431844184518461848184918501854185618581859186218671869187118721873187418751879188418861892189318941895189919011902190319061907190919101911191619181923192519281930193219361937193819391940194519491950195119631965196719681969197019721975197619801981198319861987198819891993199419961999200020012002200320042006200720092010201420172018202020212024202520372039204220432044204720482051205220562058205920612064206520662067206820692070207120742075207620772078208820912099210021022103211221132115211621182126212821302131213321372138214021442145215321542155215621572158215921602163216421652167217221742176217721782196219821992202220522072212221322142215221822192226222722282233223422352244224522482251225222542256225822592260226222672268227022712273227422772278227922802281228222832284228522872289229423072308231023112312231323142315231723192320232123272328233723422352235323562367236823732379238023902391239423952396240224182424243224332434243724382457246724802482248424852487249124972513251725392540254525492591259826012606260726112661266526672672267626772678270027012702270327072713271427202721272527402741275127592769277028022804280828522863286728682869287528762877288128822903291329162918293629522969297929822983299829993006301030193052306431283154315931773190
Evolution (EWG) · 14 all evolution issues ↗
7 resolved2 in progress3 open2 not a defect

Talks

Quizzes10

Short C++ quizzes I’ve posted, and the Most Underhanded C++ Contest 2018, with results and analysis.

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