C++20新增特性

C++ core feature!

cplusplus语言特性

新增关键字

  • concept
  • requires
  • constinit
  • consteval
  • co_await
  • co_return
  • co_yeild
  • char8_t

模块

优点

  1. 没有头文件;
  2. 声明实现仍然可分离,但非必要;
  3. 可以显式指定导出哪些类或函数;
  4. 不需头文件重复引入宏;
  5. 模块之间名称可以相同,并且不会冲突;
  6. 模块只处理一次,编译会更快(头文件每次引入都需要处理);
  7. 预处理宏只在模块内有效;
  8. 模块的引入与引入顺序无关;

Module Code

// export entirety
export namespace Test {
    auto GetTestString() {
        return "Welcome to C++20!";
    }
    
    template<typename T>
    T Sum(T t)
    {
        return t;
    }
    
    template<typename T, typename ...Args>
    T Sum(T t, Args ...args)
    {
        return t + Sum<T>(args...);
    }
    
    enum class ValueType : uint8_t {
        Bool = 0,
        Char,
        Int,
        Float,
        Double,
    };
    
    template<typename T>
    T GetType(ValueType type) {
        switch (type)
        {
            using enum ValueType;
            case Bool:
                return true;
            case Char:
                return 'A';
            case Int:
                return 10;
            case Float:
                return 3.1415926;
            case Double:
                return 0.3333333;
        }
        return true;
    }
}; // namespace Test

// export struct
export namespace StructTest {
    struct Grade {
        int val{0};
        int level{3};
    };

    void AddValue(Grade &g, int num) {
        g.val += num;
        g.level += num;
    }
};

// common export
export auto GetCommonString()
{
    return "Welcome to learn C++20!";
}

auto GetCommonString()
{
    return "Welcome to learn C++20!";
}

// export moudle x.y.z
export module c++20.test;

Main Code

import c++20.test;

int main()
{
    auto ret1 = GetCommonString();
    using namespace Test;
    auto ret3 = GetTestString();
    auto ret4 = Sum<int>(3, 4);
    auto ret5 = Sum<double>(3.14, 0.5, 0.125);
    
    auto ret6 = GetDateType<bool>(ValueType::Bool);
    auto ret7 = GetDateType<int>(ValueType::Int);
    auto ret8 = GetDateType<char>(ValueType::Char);
    
    StructTest::Grade grade;
    StructTest::AddValue(grade, 10);
    std::cout << grade.val << " | " << grade.level << std::endl;
    return 0;
}

Lambda表达式

  1. 允许[=, this]作为lambda捕获,并弃用隐式捕获[=]
  2. lambda init-capture中的包扩展:...args = [std::move(args)](){};
  3. static,thread_local,和lambda捕获结构化绑定;
  4. 模板形式的lambda;

模板形式的lambda表达式

// before c++20 获取元素的类型
auto fun = [](auto vec) {
    using T = typename decltype(vec)::value_type;
};

// C++20
auto fun = []<typename T>(vector<T> vec) {
    //...
};

lambda表达式捕获支持打包展开

// Before C++20
template<class F, class... Args>
auto DelayInvoke(F f, Args... args) {
    return [f, args...]() {
        return std::invoke(f, args...);
    };
}

// C++20
template<class F, class... Args>
auto DelayInvoke(F f, Args... args) {
    return [f = std::move(f), args = std::move(args)...]() {
        return std::invoke(f, args...);
    };
}