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
C++17
2014-10 – 2017-03
2 documents
- 2014-09
- C++14 IS N4141, members only · Editor's report N4139
C++17 DIS N4660, members only
Working draft N4659
C++20
2017-07 – 2020-04
24 documents
- 2014-10
- Working draft N4140 · Editor's report N4138
- 2014-11
- Working draft N4296 · Editor's report N4297
- 2015-04
- Working draft N4431 · Editor's report N4432
- 2015-05
- Working draft N4527 · Editor's report N4528
- 2015-11
- Working draft N4567 · Editor's report N4566
- 2016-03
- Working draft N4582 · Editor's report N4583
- 2016-05
- Working draft N4594 · Editor's report N4593
- 2016-07
- C++17 CD N4604, members only · Working draft N4606 · Editor's report N4603
- 2016-11
- Working draft N4618 · Editor's report N4619
- 2017-02
- Working draft N4640 · Editor's report N4639
- 2017-03
- C++17 DIS N4660, members only · Working draft N4659 · Editor's report N4661
C++20 DIS N4860, members only
Working draft N4861
Post-C++20
2020-10 – 2020-12
35 documents
- 2017-07
- Working draft N4687 · Editor's report N4688
- 2017-10
- Working draft N4700 · Editor's report N4701
- 2017-11
- Working draft N4713 · Editors' report N4714
- 2018-02
- Working draft N4727 · Editors' report N4728
- 2018-04
- Working draft N4741 · Editors' report N4740
- 2018-05
- Working draft N4750 · Editors' report N4749
- 2018-07
- Working draft N4762 · Editors' report N4764
- 2018-10
- Working draft N4778 · Editors' report N4779
- 2018-11
- Working draft N4791 · Editors' report N4792
- 2019-01
- Working draft N4800 · Editors' report N4799
- 2019-03
- Working draft N4810 · Editors' report N4812
- 2019-06
- Working draft N4820 · Editors' report N4821
- 2019-08
- C++20 CD N4830, members only · Editors' report N4829
- 2019-10
- Working draft N4835 · Editors' report N4836
- 2019-11
- Working draft N4842 · Editors' report N4843
- 2020-01
- Working draft N4849 · Editors' report N4850
- 2020-04
- C++20 DIS N4860, members only · Working draft N4861 · Editors' report N4859
3 documents
- 2020-10
- Working draft N4868 · Editors' report N4867
- 2020-12
- Editors' report N4879
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
2021 2 papers
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
2012 1 paper
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 ↗
33113461347134813491351135213571358135913601361136214051406140714131415142014361439144914501452145314541455145614581472147314741485148714881491150215101511151815281535155115531562158115901592
400 more
1593159415981602160316101614161516171627162816341635163816401644164516481651165216541657165816591660166516691670167216741676168016811684168716891693169416951696169717021703170417071708171017111712171317171725173217371740174117421744175417551756175717581777178817951799180018051806180818091811181718181819182018211823182818321833183418351838184018431844184518461848184918501854185618581859186218671869187118721873187418751879188418861892189318941895189919011902190319061907190919101911191619181923192519281930193219361937193819391940194519491950195119631965196719681969197019721975197619801981198319861987198819891993199419961999200020012002200320042006200720092010201420172018202020212024202520372039204220432044204720482051205220562058205920612064206520662067206820692070207120742075207620772078208820912099210021022103211221132115211621182126212821302131213321372138214021442145215321542155215621572158215921602163216421652167217221742176217721782196219821992202220522072212221322142215221822192226222722282233223422352244224522482251225222542256225822592260226222672268227022712273227422772278227922802281228222832284228522872289229423072308231023112312231323142315231723192320232123272328233723422352235323562367236823732379238023902391239423952396240224182424243224332434243724382457246724802482248424852487249124972513251725392540254525492591259826012606260726112661266526672672267626772678270027012702270327072713271427202721272527402741275127592769277028022804280828522863286728682869287528762877288128822903291329162918293629522969297929822983299829993006301030193052306431283154315931773190
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;