On July 8th 2017 I landed at YYZ in Toronto, ready for a week with over a hundred C++ experts thrashing out the details of improvements to the standard. This was my first standards meeting and I didn’t really know what to expect: I’ve read many trip reports but they tend to speak of the results more than the process. This post will describe more of the process.
After an uncomfortably large breakfast I walked to the meeting venue. The meeting opened with a plenary session. This session described what the order of business would be and described administrative points. The day started at 09:00 but this was exceptional: the remaining days would start at 08:30.
As you might expect, the room was full of people whose names you know but whose faces you haven’t necessarily seen: there was an introductions point during this session where everyone announced their name and role in turn. Additionally, diversity was rather limited: although the age distribution was good (retirees still turn up to offer the benefit of their experience, and there were undergraduates present) it was rather white and male.
Business is done by each group in their own room. There are eighteen groups in total: four working groups and fourteen study groups. The working groups work on the language (these groups are named Core and Evolution) and the library (named Library and Library Evolution). Papers arrive at the evolution groups where they are considered for inclusion in the standard, and then forwarded on to their partner for final checking before inclusion into the standard. Some papers will have an impact on both the language AND the library. Concepts, for example, requires new keywords to be added to the language, and for many library features to be decorated with their concept requirements.
The working groups were active throughout the entire meeting. There were four sessions scheduled each day of between 90 minutes and two hours. Papers were presented, discussed, and accepted or returned to the author for further development.
For the first day I decided to spend my time in the Library Evolution Working Group (LEWG). There were about a dozen of us looking at the ranges, networking and coroutines TSes before forwarding them to the Library Working Group (LWG). We also considered a paper on endian-ness from Howard Hinnant (P0463) and a paper on the “spaceship” operator from Herb Sutter for consistent comparison (P0515). These paper numbers can be appended to https://wg21.link/ to retrieve the latest revision. I’m not going to provide links to the papers: you can make your own links now!
In the evening Titus Winters presented P0684 about how we go about delivering new versions of C++, and we finished at about 21:30. I was remarkably tired, which may have been down to jet lag or the huge amount of challenging thinking I did all day.
I planned to spend time in each of the working groups, but I made my way to LEWG again as I had an interest in one of the papers scheduled for the first session. However, Walter Brown entered the room remarking that LWG was seeking a quorum and I decided to help out. Walter is the model of professional courtesy and it was hard to turn down such a politely made request.
The task at hand was checking issues with the Ranges TS. Eric Niebler and Casey Carter were iterating through the GitHub issues which were largely wording related and the rest of LWG was requesting clarification or amendment. There were half a dozen of us; the group is rather less attended than LEWG and the work is a little more particular.
The role of LEWG is to see whether a paper should be considered for inclusion in the standard or not, while the role of LWG is to ensure it’s correctly worded before passing it for publication. LEWG is a more exciting place to be as this is where the new stuff is unveiled, but LWG is necessary and needs staffing. It was very interesting seeing the process unfold, as clauses were decided, phrased and ordered appropriately. The standard is a legal document, and must be unambiguous: a lot of blue-pencil work is required. This satisfied my OCD demon.
Committee time is very valuable and there is little time for digression. We got through nearly all the outstanding priority one and priority two issues: the end was in sight but we had to follow the schedule and stop. Eric asked for volunteers to complete the job at lunchtime the next day and I offered my time. There would be pizza, plus the chance to complete the Ranges TS.
I have two papers in flight at the moment: Adding circular buffers (P0059) and Adding a 2D Graphics API (P0267). The graphics paper was scheduled for the afternoon but the nature of the paper is such that it requires a lot of eyes going through parts of it. Things were hotting up in the Evolution Working Group (EWG) as the Concepts discussion was nearing an end, and numbers were depleted in LEWG, so the graphics paper was postponed to the next day. Instead, more digestible papers were considered.
Howard Hinnant presented his paper on calendars and time zones (P0355). This is a completion of the work started with <chrono> for working with hours, minutes and seconds, introducing classes for time zones, days, months, years and calendars. This is a substantial undertaking to say the least, complicated by bringing in a dependency on an external time zone database maintained by IANA. I still feel a little queasy about this but it’s clearly the only solution unless WG21 decides to adopt time zone management into its charter. That isn’t going to happen, of course.
The evening was taken up by an extra session for the Evolution Working Group (EWG) on Concepts syntax (P0696). There was heated debate about complexity and even discourteous conduct which the chair, Ville Voutilainen, had to bring to order. In all honesty, I was uncertain why positions were held with such passion, but there was resolution and eventually consensus. At the back of my mind was the desire for everyone to kick off C++20 with some TS inclusions.
The graphics paper (P0267) was examined. It’s a big beast, weighing in at nearly 150 pages, and had garnered quite a bit of interest. Numbers were strong and the room was divided into three groups to look at two sections each. This was a common trend in LEWG: some papers do not need to be analysed by the entire room, so the group will parallelise the task and consider several papers simultaneously, returning to the entire group to present findings later in the session or at a subsequent session.
The paper is mature: although I am the co-author I only joined the effort a few months ago. Michael McLaughlin has completed the lion’s share of the work. We are seeking adoption of the paper into a TS, or Technical Specification, to get feedback from the wider C++ community. Just as Modules, Concepts, Networking and others have been offered for gathering early opinion from the final users, so we want to offer Graphics. This was not that day though, and further effort needs to be undertaken.
If graphics interests you, you can find the paper and a reference Windows implementation on GitHub. I’ve already (partially) written an Asteroids game using the implementation, and I look forward to the efforts of others. I’m sure there are more games ready to debut within the API. I might try organising a competition with prizes if interest is high enough. Watch this space.
Lunchtime rolled around and I raced to LWG. We had overrun a little in LEWG and I didn’t want to miss the pizza. Fortunately, the ordering had been generous and I settled down to minutiae over pepperoni. Ninety minutes were allocated to lunch each day, and in that time we finished all the Ranges TS issues and heaved a sigh of relief. Come the Saturday plenary, the Ranges TS could be advanced for publication. The remaining task is editorial: all the changes that have been proposed and voted for now have to be verified as present in the TS. This means that someone, or rather several people, need to go through each one line by line and check it’s there. This is called the editorial committee. I volunteered: it’s an excellent way to learn the feature, and I haven’t actually digested the whole TS yet. What better opportunity so to do while also being useful.
During the afternoon session I returned to LEWG to see my other paper being reviewed. It’s good to go, and I’ll be coming up with wording for re-presentation at the next standards meeting. We looked at two other containers also, the flat_map (P0429) and the slot_map (P0661). These associative containers will speed up dictionary lookups enormously. LWG issues a Library Fundamentals TS (version three should be started any time now) and these containers would appear in there once they have passed through LEWG and LWG.
I started noticing people yawning. The standards meeting is not a relaxing holiday: it is hard work to constantly analyse papers critically and consider their impact on the rest of the standard. A whole day’s work is tiring and it’s worth recalling that this is a voluntary effort. Nobody is paid to do this.
In the evening however it was time to relax a little. Waterfront International sponsored a celebration of C++17 and we went up the CN tower to eat and drink at their pleasure. The event started early in the evening while it was still light, and as night drew in the glittering tablecloth of man’s endeavour became apparent on the land all around us, as the street and office lights appeared. Most of the software that enabled this was probably written in C++.
I remained in LEWG; Daniel Garcia presented his contracts paper (P0542) which looks like assert on steroids. We were delighted to pass this forward to LWG. Alisdair Meredith had a paper deprecating lots of stuff from the standard (P0619). I take great joy in removing lines of code from the Total War codebase. I took similar joy in evicting no-longer relevant items from the standard.
We also looked at an example distribution of the standard library headers when modules appear: which modules will receive which headers? There was a string formatting paper (P0645) which greatly improves upon printf.
I normally spent my lunch break with a couple of colleagues in the local Belgian pub, The Prenup, which served good food and beer. It felt somewhat British, although the poutine was distinctly local.
In the afternoon we looked at P0244 which was about character encoding, and reviewed the slot_map further. I did some scribing. All the sessions require a note taker whose job is to record discussion, reasoning and proposed action points and the results of straw polls. These straw polls take the form of a question and a choice of five options from Strongly For to Strongly Against. This is how all the decisions are made. Scribing is hard but important. Unfortunately ISO rules forbid recording, so the whole things has to be done by typing as people speak, which is not an easy task, as I discovered.
Notes are kept in the wiki, which is hosted by Edison Design Group. The wiki is the sum total of all considerations of the committee, organised by venue, and then by working group and study group. Each group gets a page and the chairs are able to use their page to post relevant information during the meeting, for example a schedule of papers to be investigated, the day they are likely to be investigated and any polls and outcomes. Each paper gets its own page for notes, discussion and polls. These notes can be used by absent authors to guide future development of their papers.
SG7 met in the evening to cover reflection papers. The Study Groups specialise in particular domains such as concurrency, modules, networking and concepts to name just four. Domain specialists populate these groups, generate papers and forward them to the appropriate working group. Papers will typically go to the evolution groups.
The study groups met for one or two sessions throughout the week, although SG1, the concurrency group, met for every session. There is a lot of work to be done. There were additional evening sessions for extra work. There was always something to help with in the evening. SG7 discussed static reflection of functions (P0670) and metaprogramming by design, not by accident (P0425). There was also a presentation from Herb Sutter on metaclasses (P0707). If you were at ACCU earlier this year you would have seen his keynote and you will recall the palpable excitement; I will remark that it was as well received in Toronto as it was in Bristol.
Having spent time in LEWG, LWG and EWG, it was time for me to visit Core (CWG). We were working through the Modules TS (D0702), ensuring wording was correct. After the discussion in the other groups, the silence was deafening, broken only by the thrum of the air conditioning. I actually whispered to my neighbour.
The Modules TS is 16 pages long, and there’s plenty of whitespace, but it still took several sessions to clear. There were 18 people in the room carefully examining all the text for impact on the standard and for inconsistent phrasing that could introduce ambiguity. The pdf was modified on the fly by the author, Gabriel Dos Reis, sitting in the corner of the room composing while we verified, and we hit reload on our laptops as each correction was submitted. Additionally, the wiki was heavily edited and refreshed by Jens Maurer as business was conducted. You could see our workings in real time just by refreshing the wiki periodically.
I made my first direct contribution to the standard by correcting the use of an indefinite article from “an” to “a”. My delight was observed by Richard Smith, the WG21 project editor, for which he offered a fist bump. It was a glorious moment. There is NO petty pedantry in CWG. It’s all important. Clarity must be maximised, ambiguity must be minimised.
We completed the Modules TS and moved on to the Concepts TS in the second session. I suddenly noticed just how much cable there was in the room. Everyone brings a laptop so that they can keep up with the wiki and that means power cables and plug adaptors for the international members. We are still a long way from the wireless, paperless office.
The final session of the standards meeting is another plenary where many motions are voted on, mostly along the lines of “Incorporate this paper into the standard”. Voting members include representatives from companies and national bodies, such as the British Standards Institution (BSI), as well as individual members. The rules about who can vote are complicated. Check with your national body or contact the convenor of WG21.
The BSI caucus met for lunch in The Prenup to consider some of the more controversial papers to see what our position would be.
I returned to CWG after lunch for more drive-by fixes to the Concepts TS, but I was summoned via IRC to LEWG to discuss the container papers, including Matthew Reece’s Colony proposal (P0447) which I was presenting on his behalf. As the day drew to a close we finished up as many LEWG proposals as we could, and added another function to std::string (P0457). We couldn’t attend to all the papers that were offered for scrutiny, so there are some which will be either postponed to the next meeting or will be analysed by LEWG experts in the interim.
There was no evening session. We repaired to my hotel bar. In general the host will try and arrange a single venue for meeting space and accommodation, but this time there were two hotels and a separate meeting venue, the Bahen Centre at the University of Toronto.
The closing plenary session had a light-hearted, celebratory mood. The study groups reported on their activities this week, as did the working groups, and then we moved on to the motions. We moved coroutines, ranges, and networking TSes to editorial committee and publication, we advanced modules to ballot where it will be reflected on by the national bodies, and made modifications to the C++ working paper by including such papers as Howard’s Endian proposal.
We passed 36 motions altogether. The plenary isn’t a rubber stamp: some motions had objections and votes were taken. During the plenary I was notified by email from the BSI that I was able to vote: the process was complete. Fortunately, no motions were hanging by a thread, but it was good to raise my hand to register my support for the TSes.
With that, we were finished. We dawdled outside, chatting and promising to stay in touch, then retreated to the Prenup Pub for further beer and food, slowly drifting away as our schedules demanded. Weirdly, my plane seat was directly behind the BSI delegation chair and his wife, who had come for a holiday while he sweated over CWG.
I had the time of my life and I would choose this over a conference any time. Many thanks to my employers, Creative Assembly, for giving me the time to attend, and to the Standard C++ Foundation for funding my travel and accommodation.
Should you decide to attend a meeting for the first time, here is a to-remember list:
- There is a wiki. Make sure you retrieve the URL and login details from another delegate.
- All the groups are different in attendance, character and operation. Try them out.
- wg21.link is your most useful tool.
- Volunteer for things. History is made by those who turn up.
- Everyone is a volunteer. Nobody is out to impress anybody.
- If you don’t know something, take this rare opportunity to learn from the designers.
- Sleep well, eat properly and stay hydrated. It’s easy to forget when you’re concentrating on other things.
- Don’t be embarrassed about leaving sessions early: maybe you can’t contribute, or it’s over your head, or you don’t feel you can learn. Find somewhere else to learn or be useful. Or stay. Your choice.
Here are the things I volunteered for:
- Reaching quorum at LWG
- Writing a paper about unifying how the standard refers to Undefined Behaviour
- Ranges TS editorial committee
- Reminding Jeffrey Yasskin, LEWG chair, that we need a graphics teleconference
I’ll be blogging about the graphics paper in the coming months. Stay tuned.