Botond Ballo: Trip Report: C++ Standards Meeting in Urbana-Champaign, November 2014 |
Project | Status |
C++14 | Finalized and approved, will be published any day now |
C++17 | Some minor features so far. Many ambitious features are being explored. for (e : range) was taken out. |
Networking TS | Sockets library based on Boost.ASIO moving forward |
Filesystems TS | On track to be published early 2015 |
Library Fundamentals TS | Contains optional , any , string_view and more. No major changes since last meeting. Expected 2015. |
Library Fundamentals TS II | Follow-up to Library Fundamentals TS; will contain array_view and more. In early stage, with many features planned. |
Array Extensions TS | Continues to be completely stalled. A new proposal was looked at but failed to gain consensus. |
Parallelism TS | Progressing well. Expected 2015. |
Concurrency TS | Progressing well. Expected 2015. Will have a follow-up, Concurrency TS II. |
Transactional Memory TS | Progressing well. Expected 2015. |
Concepts (“Lite”) TS | Progressing well. Expected 2015. |
Reflection | Looking at two different proposals. Too early to say anything definitive. |
Graphics | 2D Graphics TS based on cairo moving forward |
Modules | Microsoft and Clang have implementations at various stages of completeness. They are iterating on it and trying to converge on a design. |
Coroutines | Proposals for both stackless and stackful variants will be developed, in a single TS. |
Last week I attended another meeting of the ISO C++ Standards Committee at the Univeristy of Illinois at Urbana-Champaign. This was the third and last Committee meeting in 2014; you can find my reports on the previous meetings here (February 2014, Issaquah) and here (June 2014, Rapperswil). These reports, particularly the Rapperswil one, provide useful context for this post.
The focus of this meeting was moving forward with the various Technical Specifications (TS) that are in progress, and looking ahead to C++17.
C++14 was formally approved as an Internal Standard in August when it passed its final ballot (the “DIS”, or Draft International Standard, ballot; see my Issaquah report for a description of the procedure for publishing a new language standard).
It will take another few weeks for ISO to publish the approved standard; it’s expected to happen before the end of the year.
With C++14 being approved, the Committee is turning its attention towards what its strategic goals are for the next revision of the language standard, C++17.
As I explained in my Rapperswil report, most major new features are targeted for standardization in two steps: first, as a Technical Specification (TS), an experimental publication vehicle with no backwards-compatibility requirements, to gain implementation and use experience; and then, by incorporation into an International Standard (IS), such as C++17.
Therefore, a significant amount of the content of C++17 is expected is to consist of features being published as Technical Specifications in the near future. It’s not immediately clear which TS’s will be ready for inclusion in C++17; it depends on when the TS itself is published, and whether any concerns about it come up as it’s being implemented and used. Hopefully, at least the ones being published over the next year or so, such as Filesystems, Concepts, Parallelism, Library Fundamentals I, and Transactional Memory, are considered for inclusion in C++17.
In addition, there are some major features that do not yet have a Technical Specification in progress which many hope will be in C++17: namely, Modules and Reflection. Due to the size and scope of these features, it is increasingly likely that the committee will deem it safer to standardize these as TS’s first as well, rather than targetting them directly at C++17. In this case, there may not be time for the additional step of gaining experience with the TS and merging it into the IS in time for C++17; however, it’s too early to know with any confidence at this point.
That said, C++17 will certainly contain some language and library features, and some smaller ones have already made it in. I mentioned a few in my Rapperrswil report, but some new ones came out of this meeting:
Args
is a non-type parameter pack of booleans, then Args &&...
is a new expression which is the ‘and’ of all the booleans in the pack. All binary operators support this; for operators that have a logical identity element (e.g. 0
for addition), an empty pack is allowed and evaluates to that identity.for (elem : range)
(which would have meant for (auto&& elem : range)
), was removed. (Technically, it was never added, because the C++ working draft was locked for additions in Rapperswil while the C++14 DIS ballot was in progress. However, there was consensus in the Evolution and Core Working Groups in Rapperswil to add it, and there was wording ready to be merged to the working draft as soon as the ballot concluded and it was unlocked for C++17 additions. That consensus disappeared when the feature was put up for a vote in front of full committee in Urbana.) The reason for the removal was that in for (elem : range)
, there is no clear indication that elem
is a new variable being declared; if there already is a variable named elem
in scope, one can easily get confused and think the existing variable is being used in the loop. Proponents of the feature pointed out that there is precedent for introducing a new name without explicit syntax for declaring it (such as a type) in generalized lambda captures ([name = init](){ ... }
declares a new variable named name
), but this argument was not found convincing enough to garner consensus for keeping the feature.std::uncaught_exceptions()
, a function that allows you to determine accurately whether a destructor is being called due to stack unwinding or not. There is an existing function, std::uncaught_exception()
(note the singular) that was intended for the same purpose, but was inaccurate by design in some cases, as explained in the proposal. This is considered a language feature even though it’s exposed as a library function, because implementing this function requires compiler support.u8
character literals.auto_ptr
, random_shuffle()
, ptr_fun
, mem_fun
, bind1st
, and bind2nd
.vector
, string
, valarray
, and array
.unique_ptr
std::reference_wrapper
trivially copyablenoexcept
in containersvoid_t
alias templateinvoke
function templatesize()
, empty()
, and data()
functionsAs usual, I spent most of my time in the Evolution Working Group (EWG), which concerns itself with the long-term evolution of the core language. In spite of there being a record number of proposals addressed to EWG in the pre-Urbana mailing, EWG managed to get through all of them.
Incoming proposals were categorized into three rough categories:
Accepted proposals (note: I’m not including here the ones which also passed CWG the same meeting and were voted into the standard – see above for those):
__FILE__
, __LINE__
, and __FUNCTION__
macros that doesn’t involve the preprocessor. I think this proposal constitutes a major advance because it removes one of the main remaining uses of the preprocessor.restrict
in C, but better). Some design feedback was given, but generally the proposal was considered baked enough that the next revision can go directly to CWG.constexpr
constraints, which were one of the kinds of constraints allowed in requires-expressions. The reason for the removal is that they are tricky to specify and implement, and have no major motivating uses.constexpr
character array. This one was one two competing compile-time string proposals, the other one being a variadic char...
template class which encodes the string contents in the template arguments themselves. The two proposals present a tradeoff between expressiveness and compile-time efficiency: one the one hand, encoding the string contents in the template arguments allows processing the string via template metaprogramming, while in the other proposal the string can only be processed with constexpr
functions; on the other hand, the variadic approach involves creating lots of template instantiations for string processing, which can slow down compile times signficantly. EWG’s view was that the compile-time efficiency consideration was the more important one, especially as constexpr
functions are getting more and more powerful. Therefore, the constexpr
array-based proposal was selected to move forward. As the proposal has both core language and library components, it will be going to LEWG for design review of the library components before being sent to CWG and LWG.Proposals for which further work is encouraged:
=delete
-ing them, or defined their own; one which would allow opting in to compiler-defined comparison operators via =default
; and one which would synthesize comparison operators using reflection. As suggested by the variety of the proposals, this is a feature that everyone wants but no one can agree exactly how it should work. Design considerations that came up included opt-in vs. opt-out, special handling for certain types of fields (such as mutable
fields and pointers), special handling for classes with a single member, compile-time performance, and different strengths of ordering (such as weak vs. total orders). After discussing the proposal for half a day, we ran out of time, and decided to pick up at the next meeting in Lenexa, possibly armed with revised proposals. There was one poll taken which provided fairly clear guidance on a single aspect of the proposal: there was much stronger consensus for opt-in behaviour than for opt-out.[[noreturn]]
attribute for main()
, designed for programs that are never meant to finish, such as some software running on embedded systems. This would allow the optimizer to remove code for running some cleanup such as the destructors of global objects. EWG liked the proposal, and sent it to CWG with one change, naming the attribute [[noexit]]
instead. CWG, however, pointed out that global destructors are potentially generated by all translation units, not just the one that defines main()
, and therefore the proposal is not implementable without link-time optimization. EWG discussed the proposal further, but didn’t reach any consensus, and decided to put it off until Lenexa.operator .
), similarly to how operator ->
can be overloaded. This would enable writing “smart reference” classes, much like how overloading operator ->
enables writing smart pointer classes. This would be a significant new feature, and many design considerations remain to be explored; however, there was general interest in the idea.Ts
is a parameter pack, and N
is a compile-time integral constant, Ts.[N]
is the parameter at index N
in Ts
(or a SFINAE-eligible error if the index N
is out of range). The dot is necessary for disambiguation (if the syntax were simply Ts[N]
, then consider Ts[Ns]...
, where Ns
is a parameter pack of size equal to Ts
; is this a pack of array types T_1[N_1], T_2[N_2], ...
, or is it T_(N_1), T_(N_2), ...
?). While people weren’t ecstatic about this syntax (the dot seemed arbitrary), there weren’t any better suggestions raised, and people preferred to have the feature with this syntax than to not have it at all. The second part of the proposal was less baked, and concerned “subsetting” a parameter pack with a pack of indices to yield a new pack; EWG encouraged further thought about this part, and suggested exploring two aspects separately: pack literals (for example 0 ...< 5
might be hypothetical syntax for a pack literal which expands to 0, 1, 2, 3, 4
) and pack transformations, which are operations that take a parameter pack as input, and transform it to another parameter pack.enable_if
or similar), or giving a custom diagnostic for it (expressing the constraint via a static_assert
). The specific suggestion was to allow annotating a = delete
-ed function with a custom error message that would be shown if it were chosen as the best match in overload resolution. EWG felt that this was a problem worth solving, but preferred a more general solution, and encouraged the author to come back with one.std::vector
and similar into stack allocations.Given this state of affairs, the future of classes with runtime size (and of arrays of runtime bound, which people want to tie to classes with runtime size) continues to be uncertain.
operator auto
proposal that was discussed (and encouraged for further work) in Rapperswil. EWG felt that the two use cases (scope guards and expression templates) weren’t sufficiently similar to necessitate fixing them the same way, and that the design questions raised during the operator auto
discussion weren’t adequately addressed in this proposal; encouragement was given to continue exploring the problem space, being open to different approaches for the two use cases.export
to indicate that the function’s return value refers to this parameter. EWG didn’t like this, feeling that these annotations would be “exception specifications all over again”, i.e. components of a function declaration that are not quite part of its type, for which we need ad-hoc rules to determine their behaviour with respect to redeclarations, function pointers, overrides in derived classes, being passed as non-type template arguments, and so on. The conclusion was that the problem this proposal addresses is a problem we want solved, but that this approach was not in the right direction for solving the problem.Rejected proposals:
return {expr}
be explicit, in the sense that it would allow invoking constructors of the function’s return type even if they were explicit
. This proposal had support in Rapperswil, but after several new papers argued against it, EWG decided to shelve it.a ?: b
, which would have been equivalent to a ? a : b
. EWG felt the utility wasn’t sufficiently compelling to warrant a language change.if (T x : expr) { S }
equivalent to if (auto p = expr) { T x = *p; S }
(and similarly for while
loops and the test-expressions of for
loops). EWG felt this shorthand wasn’t sufficiently compelling, and could cause confusion due to the similarity of the syntax to the range-based for loop.EWG held a special evening session on the topic of contracts, as there was a lot of interest in them at this meeting. Several papers on the topic were presented; a couple of others were not due to lack of time or a presenter.
The only proposal that was specifically considered was a proposal to turn the assert
macro into a compiler-recognized operator with one of a specified set of semantics based on the value of the NDEBUG
macro; it was rejected, mostly on the basis that it was infeasible to muck with assert
and NDEBUG
for backwards-compatibility reasons.
Other than that, the discussion was more about high-level design aspects for contract programming rather specific proposals. Some issues that came up were:
The discussion closed with some polls to query the consensus of the room:
These views will likely guide future proposals on this topic.
Coroutines was another topic with a lot of interest at this meeting. There were three proposals on the table: “resumable functions”, “resumable lambdas”, and a library interface based on Boost.Coroutine. These proposals started out under the purview of SG 1 (Concurrency), but then they started growing into a language feature with applications unrelated to concurrency as well, so the proposals were presented in an evening session to give EWG folks a chance to chime in too.
The coroutines proposals fall into two categories: stackful and stackless, with the “resumable functions” and “resumable lambdas” proposals being variations on a stackless approach, and Boost.Coroutine proposal being a stackful approach.
The two approaches have an expressiveness/performance tradeoff. Stackful coroutines have more overhead, because a stack needs to be reserved for them; the size of the stack is configurable, but making it too small risks undefined behaviour (via a stack overflow), while making it too large wastes space. Stackless coroutines, on the other hand, use only as much space as they need by allocating space for each function call on the heap (these are called activation frames; in some cases, the heap allocation can be optimized into stack allocation). The price they pay in expressiveness is that any function that calls a resumable function (i.e. a stackless coroutine) must itself be resumable, so the compiler knows to allocate activation frames on the heap when calling it, too. By contrast, with the stackful approach, any old function can call into a stackful coroutine, because execution just switches to using the coroutine’s side stack for the duration of the call.
Within the “stackless” camp, the difference between the “resumable functions” and “resumable lambdas” approaches is relatively small. The main difference is that the “resumable lambdas” approach allows coroutines to be passed around as first-class objects (since lambdas are objects).
The authors of the “resumable functions” and Boost.Coroutine proposals have attempted to come up with a unified proposal that combines the power of “stackful” with the expressiveness of “stackless”, but haven’t succeeded, and in fact have come to believe that the tradeoff is inherent. In light of this, and since both approaches have compelling use cases, the committee was of the view that both approaches should be pursued independently, both targetting a single Coroutines Technical Specification, with the authors co-operating to try to capture any commonalities between their approaches (if nothing else then a common, consistent set of terminology) even if a unified proposal isn’t possible. For the stackless approach, participants were polled for a preference between the “resumable functions” and “resumable lambdas” approaches; there was stronger support for the “resumable functions” approach, though I think this was at least in part due to the “resumable lambdas” approach being newer and less well understood.
I had a chance to speak to Chris Kohlhoff, the author of the “resumable lambdas” proposal, susbequent to this session. He had an idea for combining the “stackless” and “stackful” approaches under a single syntax that I found very interesting, which he plans to prototype. If it pans out, it might end up as the basis of compelling unified proposal after all.
I’m quite excited about the expressivity coroutines would add to the language, and I await developments on this topic eagerly, particularly on Chris’s unified approach.
The topic of forming a Study Group to explore ways to make C++ more suitable for embedded systems came up again. In addition to the two papers presented on the topic, some further ideas in this space were containers that can be stored in ROM (via constexpr
), and having exceptions without RTTI. It was pointed out that overhead reductions of this sort might be of interest to other communities, such as gaming, graphics, real-time programming, low-latency programming, and resource-constrained systems. EWG encouraged discussion across communities before forming a Study Group.
I mentioned the library features that are targeted for C++17 in the “C++17'' section above. Here I’ll talk about progress on the Library Fundamentals Technical Specifications, and future work.
The first Library Fundamentals TS has already gone through its first formal ballot, the PDTS (Preliminary Draft Technical Specification) ballot. LWG addressed comments sent in by national standards bodies in response to the ballot; the resulting changes were very minor, the most notable being the removal of the network byte-order conversion functions (htonl()
and friends) over concerns that they clash with similarly-named macros. LWG will continue addressing the comments during a teleconference in December, and then they plan to send out the specification for its DTS (Draft Technical Specification) ballot, which, if successful, will be its last before publication.
The second Library Fundamentals TS is in the active development stage. Coming into the meeting, it contained a single proposal, for a generalized callable negator. During this meeting, several new features were added to it:
observer_ptr
, the world’s dumbest smart pointerThere will very likely be more features added at the next meeting, in May 2015; the TS is tentatively scheduled to be sent out for its PDTS ballot at the end of that meeting.
In addition to the proposals which have already been added into C++17 or one of the TS’s, there are a lot of other library proposals in various stages of consideration.
Proposals approved by LEWG and under review by LWG:
pair
and tuple
index
, and array_view
make_shared
make_array
(targeting Fundamentals II)Proposals approved by LEWG for which LWG review is yet to start:
const
-propagating wrapper (targeting Fundamentals II)Proposal for which LEWG is encouraging further work:
std::function
std::bind
(LEWG only liked _all
)ostream
buffersProposals rejected by LEWG:
vector
There will be a special library-only meeting in Cologne, Germany in February to allow LWG and LEWG to catch up a bit on all these proposals.
SG 1’s main projects are the Concurrency TS and the Parallelism TS. As with the Library Fundamentals TS, both are likely to be the start of a series of TS’s (so e.g. the Parallelism TS will be followed by a Parallelism TS II).
Besides coroutines, which I talked about above, I haven’t had a chance to follow SG 1’s work in any amount of detail, but I will mention the high-level status:
The Parallelism TS already had its PDTS ballot; comments were addressed this week, resulting in minor changes, including the addition of a transform-reduce algorithm. SG 1 will continue addressing comments during a teleconference in December, and then plans to send the spec out for its DTS ballot. As mentioned above, there are plans for a Parallelism TS II, but no proposals have been approved for it yet.
The Concurrency TS has not yet been sent out for its PDTS ballot; that is now planned for Lenexa.
Some library proposals that have been approved by LEWG for the Concurrency TS:
Task regions are still being considered by LEWG, and would likely target Concurrency TS II.
A major feature being looked at by SG 1 is executors and schedulers, with two competing proposals. The two approaches were discussed, and SG 1 felt that at this stage there’s still design work to be done and it’s too early to make a choice. This feature is targeting the second Concurrency TS as it’s unlikely to be ready in time for Lenexa, and SG 1 doesn’t want to hold up the first Concurrency TS beyond Lenexa.
Coroutines are also a concurrency feature, but as mentioned above, they are now targeting a separate TS.
EWG spent an afternoon discussing modules. At this point, Microsoft and Clang both have modules implementations, at various levels of completion. The Microsoft effort is spearheaded by Gabriel Dos Reis, who summarized the current state of affairs in a presentation.
The goals of modules are:
The aspects of a modules design that people generally agree on at this point are:
Design points that still need further thought are:
#include
s in a moduleEWG was generally pleased with the progress being made, and encouraged implementors to continue collaborating to get their designs to converge, and report back in Lenexa.
The Clang folks also reported promising performance numbers from their implementation, but detailed/comprehensive benchmarks remain to be performed.
SG 3 did not meet in Urbana. The Filesystems TS is waiting for its DTS ballot to close; assuming it’s successful (which is the general expectation), it will be published early next year.
Proposals targeting a follow-up Filesystems TS II are welcome; none have been received so far.
Organizationally, the work of SG 4 has been conducted directly by LEWG over the past few meetings. This arrangement has been formalized at this meeting, with SG 4’s chair, Kyle Kloepper, retiring, and the SG becoming “dormant” until LEWG decides to reactivate it.
In Rapperswil, LEWG had favourably reviewed a proposal for a C++ networking library based on Boost.ASIO, and asked the author (Chris Kohlhoff, whom I’ve talked about earlier in the context of coroutines) to update the proposal to leverage C++14 language features. Chris has done so, and presented an updated proposal to LEWG in Urbana; this update was also received favourably, and was voted to become the initial working draft of the Networking TS, which now joins the roster of Technical Specifications being worked on by the committee. In other words, we’re one step closer to having a standard sockets library!
I haven’t been following the work of SG 5 very closely, but I know the Transactional Memory TS is progressing well. Its working draft has been created based on two papers, and it’s going to be sent out for its PDTS ballot shortly (after a review conducted via teleconference), with the intention being that the ballot closes in time to look at the comments in Lenexa.
Topics of discussion in SG 6 included:
std::rand
which combines the security of the C++11
facilities with the simple interface of std::rand
int16_t
for floating-point typesA Numerics TS containing proposals for some of the above may be started in the near future.
There is an existing TR (Technical Report, an older name for a Technical Specification) for decimal floating-point arithmetic. There is a proposal to integrate this into C++17, but there hasn’t been any new progress on that in Urbana.
SG 7 looked at two reflection proposals: an updated version of a proposal for a set of type traits for reflecting the members of classes, unions, and enumerations, and a a significantly reworked version of a comprehensive proposal for static reflection.
The reflection type trait proposal was already favourably reviewed in Rapperswil. At this meeting, additional feedback was given on two design points:
std::reflect
which provides traits for reflecting accessible members only, and another called std::reflect_invasively
which provides traits for reflecting all members including inaccessible ones). The rationale is that for some use cases, reflecting only over accessible members is appropriate, while for others, reflecting over all members is appropriate, and we want to be able to spot uses of an inappropriate mechanism easily. Some people also expressed a desire to opt-out from invasive reflection on a per-class basis.C
is std::class_member::name
. A preference was expressed a) for an additional level of grouping of reflection-related traits into a namespace or class reflect
, e.g. std::reflect::class_member::name
, and b) for not delaying the provision of all inputs until the last component of the trait, e.g. std::reflect::class_member<1>::name
. (This last form has the disadvantage that it would actually need to be std::reflect::template class_member<1>::name
; some suggestions were thrown around for avoiding this by making the syntax use some compiler magic (as the traits can’t be implemented purely as a library anyways)).It was also reiterated that this proposal has some limitations (notably, member templates cannot be reflected, nor can members of reference or bitfield type), but SG 7 remains confident that the proposal can be extended to fill these gaps in due course (in some cases with accompanying core language changes).
The comprehensive static reflection proposal didn’t have a presenter, so it was only looked at briefly. Here are some key points from the discussion:
There is also a third proposal for reflection, “C++ type reflection via variadic template expansion”, which sort of fell off SG 7’s radar because it was in the post-Issaquah mailing and had no presenter in Rapperswil or Urbana; SG 7 didn’t look at it in Urbana, but plans to in Lenexa.
The Core Working Group continued reviewing the Concepts TS (formerly called “Concepts Lite”) in Urbana. The fundamental design has not changed over the course of this review, but many details have. A few changes were run by EWG for approval (I mentioned these in the EWG section above: the removal of constexpr
constraints, and the addition of folding expressions). The hope was to be ready to send out the Concepts TS for its PDTS ballot at the end of the meeting, but it didn’t quite make it. Instead, CWG will continue the review via teleconferences, and possibly a face-to-face meeting, for Concepts only, in January. If all goes well, the PDTS ballot might still be sent out in time for the comments to arrive by Lenexa.
As far as SG 9 is concerned, this has been the most exciting meeting yet. Eric Niebler presented a detailed and well fleshed-out proposal for integrating ranges into the standard library.
Eric’s ranges are built on top of iterators, thus fitting on top of today’s iterator-based algorithms almost seamlessly, with one significant change: the begin and end iterators of a range are not required to be of the same type. As the proposal explains, this small change allows a variety of ranges to be represented efficiently that could not be under the existing same-type model, including sentinel- and predicate-based ranges.
The main parts of the proposal are a set of range-related concepts, a set of range algorithms, and a set of range views. The foundational concept is Iterable
, which corresponds roughly to what we conversationally call (and also what the Boost.Range library calls) a “range”. An Iterable
represents a range of elements delimited by an Iterator
at the beginning and a Sentinel
at the end. Two important refinements of the Iterable
concept are Container
, which is an Iterable
that owns its elements, and Range
, which is a lightweight Iterable
that doesn’t own its elements. The range algorithms are basically updated versions of the standard library algorithms that take ranges as Iterable
s; there are also versions that take (Iterator
, Sentinel
) pairs, for backwards-compatibiltiy with today’s callers. Finally, the range views are ways of transforming ranges into new ranges; they correspond to what the Boost.Range library calls range adaptors. There is also a suggestion to enhance algorithms with “projections”; I personally see this as unnecessary, since I think range views serve their use cases better.
Eric has fully implemented this proposal, thus convincingly demonstrating its viability.
Importantly, this proposal depends on the Concepts TS to describe the concepts associated with ranges and define algorithms and views in terms of these functions. (Eric’s implementation emulates the features of the Concepts TS with a C++11 concepts emulation layer.)
The proposal was overall very well received; there was clear consensus that Eric should pursue the high-level design he presented and come back with a detailed proposed specification.
An important practical point that needed to be addressed is that this proposal is not 100% backwards-compatible with the current STL. This wasn’t viewed as a problem, as previous experience trying to introduce C++0x concepts to the STL while not breaking anything has demonstrated that this wasn’t possible without a lot of contortions, and people have largely accepted that a clean break from the old STL is needed to build a tidy, concepts-enabled “STL 2.0''. Eric’s proposal covers large parts of what such an STL 2.0 would look like, so there is good convergence here. The consensus was that Eric should collaborate with Andrew Sutton (primary author and editor of the Concepts TS) on a proposal for a Technical Specification for a concepts-enabled ranges library; the exact scope (i.e. whether it will be just a ranges library, or a complete STL overhaul) is yet to be determined.
The Feature Test Standing Document (the not-quite-a-standard document used by the committee to specify feature test macros) has been updated with C++14 features.
The feature test macros are enjoying adoption by multiple implementors, including GCC, Clang, EDG, and others.
SG 12 looked at:
memcpy()
that is currently technically undefined, but people expect it to work.SG 13 has been working on a proposal for 2D Graphics TS based on cario’s API. In Urbana, an updated version of this proposal which included some proposed wording was presented to LEWG. LEWG encouraged the authors to complete the wording, and gave a couple of pieces of design advice:
The next full meeting of the Committee will be in Lenexa, Kansas, the week of May 4th, 2015.
There will also be a library-only meeting in Cologne, Germany the week of Feberuary 23rd, and a Concepts-specific meeting in Skillman, New Jersey from January 26-28.
This was probably the most action-packed meeting I’ve been to yet! My personal highlights:
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |