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 ↗

Issues518

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

resolved in progress open not a defect or duplicate
Core (CWG) · 449 all core issues ↗
312 resolved49 in progress43 open45 not a defect
401 more
15931594159816021603161016141615161716271628163416351638164016441645164816511652165416571658165916601665166916701672167416761680168116841687168916931694169516961697170217031704170717081710171117121713171717251732173717401741174217441754175517561757175817771788179517991800180518061808180918111817181818191820182118231828183218331834183518381840184318441845184618481849185018541856185818591862186718691871187218731874187518791884188618921893189418951899190119021903190619071909191019111916191819231925192819301932193619371938193919401945194919501951196319651967196819691970197219751976198019811983198619871988198919931994199619992000200120022003200420062007200920102014201720182020202120242025203720392042204320442047204820512052205620582059206120642065206620672068206920702071207420752076207720782088209120992100210221032112211321152116211821262128213021312133213721382140214421452153215421552156215721582159216021632164216521672172217421762177217821962198219922022205220722122213221422152218221922262227222822332234223522442245224822512252225422562258225922602262226722682270227122732274227722782279228022812282228322842285228722892294230723082310231123122313231423152317231923202321232723282337234223522353235623672368237323792380239023912394239523962402241824242432243324342437243824572467248024822484248524872491249725132517253925402545254925912598260126062607261126612665266726722676267726782700270127022703270727132714272027212725274027412751275927692770280228042808285228632867286828692875287628772881288229032913291629182936295229692979298229832998299930063010301930523064312831543159317731903205
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;