So, after writing about a bunch of things that _won't_ be in C++14,
let me summarize what _will_ be. Here are the highlights:

  * Return type deduction

    In C++11, we have decltype() and late-specified return types
    (return types written after the argument list so they can
    mention arguments). These were often combined to write code
    like this:
    
      auto function(A a, B b) -> decltype(expr)
      {
          return expr;
      }

    Having to repeat 'expr' is rather unfortunate, and C++14
    fixes that. You can now write:

      auto function(A a, B b)
      {
          return expr;
      }

    It works even if the function body contains multiple 
    statements, control flow, etc. The only restriction is 
    that if there are multiple return expressions, they
    must all have the same type.

  * Improved lambdas
     
     * Generic lambdas

       These are lambdas with 'auto' arguments which acts as
       template parameters rather than concrete types:

         // This lambda can be called with arguments of any type.
         [](auto a, auto b){ return a > b; }

       Implementation-wise, they are just local structures with
       a templated call operator (while ordinary lambdas are
       local structures with a non-templated call operator).

     * Init-captures

       These allow you to declare new variables in the capture-list
       rather than just capture existing variables from the outer
       scope. The new variables can be initialized in any way,
       including by move, something that wasn't possible before.

         std::unique_ptr<Foo> p = ...;
         ...
         // No way to capture 'p' in C++11. Can't capture it by
         // value because it's not copyable; don't want to capture
         // it by reference because the reference could become
         // dangling if the lambda is passed out of the function.
         // In C++14 we can do this:
         [newp = move(p)](...){...}

  * Variable templates

    Up until now, only functions and classes/structures could be
    templates. Now, variables can be too.

  * More powerful constexpr

    Up until now, constexpr functions were limited to containing
    a single return expression. Now they can contain multiple
    statements, loops, and so on. Basically, they can now be
    written in an imperative style rather than a functional 
    style. They still can't modify non-local state.

  * Improved literals

     * Binary literals:   0b00101010101

     * Digit separators:  int x = 1'000'000;  // don't ask

  * Standard user-defined literals

    C++11 introduced user-defined literals. C++14 intoduces
    some standard ones:
 
      "foo"s  // std::string literal
 
      30s     // std::chrono::seconds literal
              
    Yes, they are both 's'. C++ knows when to use which.
    Other durations have them too, so you can write things
    like
      
      1h + 10min + 30s


Botond
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to