Skip to main content
Redhat Developers  Logo
  • AI

    Get started with AI

    • Red Hat AI
      Accelerate the development and deployment of enterprise AI solutions.
    • AI learning hub
      Explore learning materials and tools, organized by task.
    • AI interactive demos
      Click through scenarios with Red Hat AI, including training LLMs and more.
    • AI/ML learning paths
      Expand your OpenShift AI knowledge using these learning resources.
    • AI quickstarts
      Focused AI use cases designed for fast deployment on Red Hat AI platforms.
    • No-cost AI training
      Foundational Red Hat AI training.

    Featured resources

    • OpenShift AI learning
    • Open source AI for developers
    • AI product application development
    • Open source-powered AI/ML for hybrid cloud
    • AI and Node.js cheat sheet

    Red Hat AI Factory with NVIDIA

    • Red Hat AI Factory with NVIDIA is a co-engineered, enterprise-grade AI solution for building, deploying, and managing AI at scale across hybrid cloud environments.
    • Explore the solution
  • Learn

    Self-guided

    • Documentation
      Find answers, get step-by-step guidance, and learn how to use Red Hat products.
    • Learning paths
      Explore curated walkthroughs for common development tasks.
    • Guided learning
      Receive custom learning paths powered by our AI assistant.
    • See all learning

    Hands-on

    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.
    • Interactive labs
      Learn by doing in these hands-on, browser-based experiences.
    • Interactive demos
      Click through product features in these guided tours.

    Browse by topic

    • AI/ML
    • Automation
    • Java
    • Kubernetes
    • Linux
    • See all topics

    Training & certifications

    • Courses and exams
    • Certifications
    • Skills assessments
    • Red Hat Academy
    • Learning subscription
    • Explore training
  • Build

    Get started

    • Red Hat build of Podman Desktop
      A downloadable, local development hub to experiment with our products and builds.
    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.

    Download products

    • Access product downloads to start building and testing right away.
    • Red Hat Enterprise Linux
    • Red Hat AI
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat Developer Toolset

    References

    • E-books
    • Documentation
    • Cheat sheets
    • Architecture center
  • Community

    Get involved

    • Events
    • Live AI events
    • Red Hat Summit
    • Red Hat Accelerators
    • Community discussions

    Follow along

    • Articles & blogs
    • Developer newsletter
    • Videos
    • Github

    Get help

    • Customer service
    • Customer support
    • Regional contacts
    • Find a partner

    Join the Red Hat Developer program

    • Download Red Hat products and project builds, access support documentation, learning content, and more.
    • Explore the benefits

Jacksonville C++ Core Language Meeting Report

May 16, 2016
Jason Merrill
Related products:
Developer Toolset

    There were three of us from Red Hat at the C++ meeting in Jacksonville, FL back in February, and it seems I never posted my trip report. So here it is now.

    This was a fairly eventful meeting, as we're rapidly approaching C++17 and so the big question on everyone's minds was "What's going to make it in?" In the end, many things did, but not Concepts, which some had been hoping for as a headline item.

    We started and finished the week looking at the list of Technical Specifications that we were considering incorporating into C++17.

    First up was the Special Math Functions TS, which the math community has been pushing for since before C++11. Back in 2010 there was a lot of concern about the work and expertise necessary to get a decent implementation, but in the intervening years it has been a separate standard with multiple implementations, including libstdc++ and Boost, and so this time around there was no significant opposition.

    The File System TS was up next; there have been multiple implementations in addition to the original Boost library, and issues resolved against the TS. Some people raised concerns about its suitability for unusual, e.g. non-hierarchical, filesystems, but there was general consensus that it should go in.

    The Parallelism TS was also reported to have significant implementation experience, both with the TS specification and libraries that preceded it such as the libstdc++ parallel mode. There was some concern about possible future breaking changes, but not broad enough to delay inclusion. For more on the Parallelism and Concurrency view of the meeting, see Torvald's post.

    Most of Library Fundamentals v1 (all but the invocation traits) was also adopted into the working paper.

    Finally there was Concepts. There were a lot of people arguing both for and against integrating the TS into the working paper for C++17. Those arguing in favor pointed out that we've had an implementation for a while (in GCC snapshots since August 2015, usable on a development branch since about October 2014), and there's been significant user experience with that implementation, including development of the Ranges TS, and the user experience has been very positive. Furthermore, we're seeing more and more library proposals that rely on concepts, and we don't want to force them to rework to use enable_if hackery.

    Those arguing against pointed out that there hasn't been a second implementation yet, there hadn't been a formally released compiler (though there is now), and there are still significant objections to certain aspects of the design (terse function template notations, function/variable duality, potential for future definition checking); these objections were raised during the TS process and deferred, but they still have not been resolved. This seemed over-cautious to me, but understandable after our experience with C++11 concepts.

    In the end, the TS was not accepted into the working paper, so I've removed the feature from -std=c++1z for the GCC 6.1 release; users can enable concept support with the ‑fconcepts flag.

    After the TS polling, we separated into subgroups. As usual, I spent most of the week in the Core working group (CWG), where we spent most of the week reviewing papers to introduce various smaller features that Evolution (EWG) approved for C++17, so we didn't do much processing of issues.

    New features that completed Core review and were voted into the working paper at the end of the meeting:

    The [[fallthrough]] attribute, equivalent to the [[clang::fallthrough]] attribute, or a lint fallthrough comment:

    switch (i) {
      case 1:
        foo();
        [[fallthrough]]; // Don't warn about missing break.
      case 2:
        ...
    }
    

    The [[nodiscard]] attribute, similar to [[gnu::warn_unused_result]], but [[nodiscard]] can also be applied to classes, and can be suppressed by an explicit cast to void.

    class [[nodiscard]] A { ... };
    A f();
    
    int main()
    {
      f(); // warning: discarding nodiscard return value.
    }
    

    The [[maybe_unused]] attribute, equivalent to [[gnu::unused]].

    [[maybe_unused]] static void
    debug_dump() { ... } // don't warn if nothing calls this
    

    P0138R2: Simplifying initialization of enum class variables from integers, so that users can write

    E e {42};

    rather than

    E e = E{42};

    P0017R1: Allowing aggregate initialization of base classes.

    struct B { int i; };
    struct D: B { int j; };
    D d { {1}, 2 };
    

    P0170R1: Making lambdas constexpr.

    constexpr int AddEleven(int n) {
      return [n]{ return n+11; }(); // OK in C++17
    }
    static_assert(AddEleven(5)==16);
    

    P0018R3: Lambda capture by of *this to capture the entire object by value.

    struct A {
      int i;
      auto f() { return [*this]{return i;}; }
    };
    auto l = A().f(); // closure contains a copy of the A temporary
    auto i = l();     // OK, no dangling pointer
    

    P0245R1: C99 Hexadecimal floating point literals (which G++ has had since 3.0)

    float f = 0xC.68p+2; // 49.625
    

    Papers that got a lot of core review, weren't quite ready by the end of the meeting, but are expected to make it in at the Oulu meeting in June:

    P0003R2: Removing deprecated C++98 (dynamic) exception-specifications. This has been coming for many years.

    P0035R2: 'new' of C++11 over-aligned types, so that

    class alignas(64) cache_aligned_int { int i; };
    auto p = new cache_aligned_int;
    

    will actually have the correct alignment, rather than just what malloc happens to provide.

    P0292R0: if constexpr to avoid instantiating sections of a function template controlled by a false constant-expression, e.g.

    template<typename T, typename ... Rest> void g(T&& p, Rest&& ...rs) {
      // ... handle p
      if constexpr (sizeof...(rs) > 0)
        g(rs...);  // never instantiated with an empty argument list.
    }
    

    Without the if constexpr, we would need another overload of g to handle the case where rs is empty.

    P0252R0: operator. for smart references in the same way that smart pointers define operator->.

    struct A { int i; } a;
    struct B { int j; } b;
    struct C {
      A& operator.() { return a; };
      B& operator.() { return b; };
    } c;
    void f() { c.i = c.j = 42; }
    

    P0145R1: Setting the evaluation order of many operations that are currently unspecified, to fix chaining of member function calls. In this example from the paper,

    void f()
    {
      std::string s = "but I have heard it works even if you don't believe in it"
      s.replace(0, 4, "").replace(s.find("even"), 4, "only")
       .replace(s.find(" don't"), 6, "");
      assert(s == "I have heard it works only if you believe in it");
    }
    

    The currently unspecified order of evaluation means that the find calls could be evaluated before the first replace call, which then makes their results wrong.

    The current sentiment of the committee is to also specify that normal function
    arguments are evaluated from left to right. This will be a significant change
    for GCC, which currently evaluates arguments from right to left on many
    targets, including x86_64; now that GCC 6 is out, I want to try forcing
    left-to-right evaluation in G++ to see what impact it has on our benchmarks.

    P0251R0:
    Unified function call syntax, calling member functions and free functions using
    the same syntax.

      struct A { void f(); } a;
      int main() { f(a); } // treated as a.f();
    

    This was expected to be accepted at the meeting, but ended up being withdrawn
    for revision; it seems likely that the call syntax will change.

    Also Torvald's forward progress paper, discussed in his blog post.

    Papers that haven't gotten significant core review yet, but EWG would like to see in C++17:

    P0221R1: Compiler-generated comparison operators, providing implicit definitions of operator== and such as appropriate. This proposal also tries to prevent common slicing bugs by prohibiting copy construction or assignment from a derived class without some obfuscation:

    struct B { int i; };
    struct D: B { int j; };
    
    int main()
    {
      D d { {1}, 2 }; // C++17 aggregate initialization
      B b (d);        // OK in C++14, now ill-formed
      B b (static_cast<B&>(d)); // OK
    }
    

    If this passes, I expect it to be a source of porting headaches for people moving to C++17, but I'm sure implementations will provide a way to accept affected code with a warning.

    P0091R1: Omitting template arguments for class templates when they can be deduced from an initializer, to avoid the need for function templates like make_pair:

    std::pair p (2, 4.5); // pair<int,double>
    

    N4424: Inline variables, allowing users to define variables with linkage like a static
    data member of a template without actually needing to wrap it in a template.

    struct WithStaticDataMember {
      // This is a definition, no out­-of-­line definition is required.
      static inline constexpr const char *kFoo = "foo bar";
    };
    

    The next meeting is in Oulu, Finland in the middle of June; this will be an important meeting, as it will determine the final feature set for C++17.

    Last updated: February 6, 2024

    Recent Posts

    • Every layer counts: Defense in depth for AI agents with Red Hat AI

    • Fun in the RUN instruction: Why container builds with distroless images can surprise you

    • Trusted software factory: Building trust in the agentic AI era

    • Build a zero trust AI pipeline with OpenShift and RHEL CVMs

    • Red Hat Hardened Images: Top 5 benefits for software developers

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Build

    • Developer Sandbox
    • Developer tools
    • Interactive tutorials
    • API catalog

    Quicklinks

    • Learning resources
    • E-books
    • Cheat sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site status dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2026 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Chat Support

    Please log in with your Red Hat account to access chat support.