ITPub博客

首页 > 应用开发 > IT综合 > C++11类型系统深度解析:引用折叠、完美转发与可变参数模板

C++11类型系统深度解析:引用折叠、完美转发与可变参数模板

投稿 IT综合 作者:bhluo 时间:2025-12-17 16:10:08 0 删除 编辑

# C++11类型系统深度解析:引用折叠、完美转发与可变参数模板


C++11在类型系统方面进行了重大革新,引入了更精细的类型分类、引用折叠规则、完美转发机制和可变参数模板。这些特性共同构成了现代C++类型安全与性能优化的重要基础。


## 一、类型分类与类型推导


### 1. 现代C++类型分类体系


C++11扩展了类型系统,提供了更精细的类型分类和检查机制。


```cpp

#include <iostream>

#include <type_traits>


// 类型分类检查工具函数

template<typename T>

void type_categories(const T& value, const std::string& name) {

    std::cout << "\n=== 类型分类: " << name << " ===" << std::endl;

    

    // 基础类型检查

    std::cout << "is_void: " << std::is_void<T>::value << std::endl;

    std::cout << "is_integral: " << std::is_integral<T>::value << std::endl;

    std::cout << "is_floating_point: " << std::is_floating_point<T>::value << std::endl;

    std::cout << "is_pointer: " << std::is_pointer<T>::value << std::endl;

    std::cout << "is_reference: " << std::is_reference<T>::value << std::endl;

    

    // 引用类型细分

    std::cout << "is_lvalue_reference: " << std::is_lvalue_reference<T>::value << std::endl;

    std::cout << "is_rvalue_reference: " << std::is_rvalue_reference<T>::value << std::endl;

    

    // 复合类型检查

    std::cout << "is_array: " << std::is_array<T>::value << std::endl;

    std::cout << "is_class: " << std::is_class<T>::value << std::endl;

    std::cout << "is_function: " << std::is_function<T>::value << std::endl;

}


// 测试不同类型

void test_type_categories() {

    std::cout << "=== C++11类型分类系统 ===" << std::endl;

    

    int i = 42;

    int& lref = i;

    int&& rref = 100;

    int* ptr = &i;

    const int ci = 50;

    const int& clref = i;

    

    type_categories(i, "int");

    type_categories(lref, "int& (左值引用)");

    type_categories(rref, "int&& (右值引用)");

    type_categories(ptr, "int*");

    type_categories(ci, "const int");

    type_categories(clref, "const int&");

    

    // 数组和函数类型

    int arr[5];

    type_categories(arr, "int[5]");

    

    auto func_ptr = &test_type_categories;

    type_categories(func_ptr, "函数指针");

}


// 类型关系检查

void test_type_relationships() {

    std::cout << "\n=== 类型关系检查 ===" << std::endl;

    

    // 类型相同检查

    std::cout << "is_same<int, int>: " 

              << std::is_same<int, int>::value << std::endl;

    std::cout << "is_same<int, const int>: " 

              << std::is_same<int, const int>::value << std::endl;

    

    // 类型转换关系

    std::cout << "\n类型转换关系:" << std::endl;

    std::cout << "is_convertible<int, double>: " 

              << std::is_convertible<int, double>::value << std::endl;

    std::cout << "is_convertible<double, int>: " 

              << std::is_convertible<double, int>::value << std::endl;

    

    // 基础类型检查

    std::cout << "\n基础类型属性:" << std::endl;

    std::cout << "is_const<const int>: " 

              << std::is_const<const int>::value << std::endl;

    std::cout << "is_volatile<volatile int>: " 

              << std::is_volatile<volatile int>::value << std::endl;

    std::cout << "is_trivial<int>: " 

              << std::is_trivial<int>::value << std::endl;

}

```


### 2. decltype类型推导


decltype提供了编译时类型推导能力,与auto形成互补。


```cpp

#include <vector>

#include <map>


void test_decltype_features() {

    std::cout << "\n=== decltype类型推导 ===" << std::endl;

    

    int i = 42;

    const int& cr = i;

    

    // decltype推导表达式类型

    decltype(i) di = i;           // int

    decltype(cr) dcr = cr;        // const int&

    decltype(i + 5.0) dsum;       // double

    

    std::cout << "decltype(i): " << typeid(di).name() << std::endl;

    std::cout << "decltype(cr): " << typeid(dcr).name() << std::endl;

    std::cout << "decltype(i + 5.0): " << typeid(dsum).name() << std::endl;

    

    // decltype在模板中的应用

    std::vector<int> vec = {1, 2, 3, 4, 5};

    decltype(vec)::value_type element = vec[0];

    std::cout << "vector value_type: " << typeid(element).name() << std::endl;

    

    // decltype(auto) - C++14特性,但值得了解

    decltype(auto) da1 = i;        // int

    decltype(auto) da2 = (i);      // int& (注意括号的影响)

    decltype(auto) da3 = cr;       // const int&

    

    // decltype推导函数返回类型

    auto add = [](int a, int b) -> decltype(a + b) {

        return a + b;

    };

    

    std::cout << "add(3, 4) = " << add(3, 4) << std::endl;

    std::cout << "返回类型: " << typeid(decltype(add(3, 4))).name() << std::endl;

    

    // decltype在尾置返回类型中的应用

    auto get_element = [](const std::vector<int>& v, size_t idx) 

        -> decltype(v[idx]) {

        return v[idx];

    };

    

    auto element_ref = get_element(vec, 0);

    std::cout << "get_element返回类型: " 

              << typeid(element_ref).name() << std::endl;

}

```


## 二、引用折叠与转发引用


### 1. 引用折叠规则深度解析


引用折叠是理解完美转发的关键,C++11定义了明确的引用折叠规则。


```cpp

#include <utility>


// 引用折叠规则演示

template<typename T>

struct ReferenceFoldChecker {

    static void check() {

        std::cout << "T: " << typeid(T).name() << std::endl;

        

        // 引用折叠规则

        using T1 = T&;

        using T2 = T&&;

        using T3 = T1&;    // T& & → T&

        using T4 = T1&&;   // T& && → T&

        using T5 = T2&;    // T&& & → T&

        using T6 = T2&&;   // T&& && → T&&

        

        std::cout << "T&: " << typeid(T1).name() << std::endl;

        std::cout << "T&&: " << typeid(T2).name() << std::endl;

        std::cout << "T& & (折叠为): " << typeid(T3).name() << std::endl;

        std::cout << "T& && (折叠为): " << typeid(T4).name() << std::endl;

        std::cout << "T&& & (折叠为): " << typeid(T5).name() << std::endl;

        std::cout << "T&& && (折叠为): " << typeid(T6).name() << std::endl;

    }

};


void test_reference_collapsing() {

    std::cout << "\n=== 引用折叠规则 ===" << std::endl;

    

    std::cout << "\n1. 模板参数为 int:" << std::endl;

    ReferenceFoldChecker<int>::check();

    

    std::cout << "\n2. 模板参数为 int&:" << std::endl;

    ReferenceFoldChecker<int&>::check();

    

    std::cout << "\n3. 模板参数为 int&&:" << std::endl;

    ReferenceFoldChecker<int&&>::check();

    

    // 实际应用示例

    std::cout << "\n4. 实际应用示例:" << std::endl;

    

    int x = 10;

    int& lref = x;

    int&& rref = 20;

    

    // 引用折叠在实际代码中的表现

    auto&& uref1 = x;      // int& && → int&

    auto&& uref2 = lref;   // int& & → int&

    auto&& uref3 = rref;   // int&& & → int&

    auto&& uref4 = 30;     // int&&

    

    std::cout << "auto&& uref1 = x;   类型: " << typeid(uref1).name() << std::endl;

    std::cout << "auto&& uref2 = lref;类型: " << typeid(uref2).name() << std::endl;

    std::cout << "auto&& uref3 = rref;类型: " << typeid(uref3).name() << std::endl;

    std::cout << "auto&& uref4 = 30;  类型: " << typeid(uref4).name() << std::endl;

}

```


### 2. 转发引用(通用引用)详解


转发引用是C++11引入的重要概念,结合模板推导和引用折叠实现完美转发。


```cpp

// 转发引用模板函数

template<typename T>

void forward_reference_example(T&& param) {

    std::cout << "\n转发引用示例: T&& param" << std::endl;

    std::cout << "参数类型 T: " << typeid(T).name() << std::endl;

    std::cout << "参数类型 param: " << typeid(param).name() << std::endl;

    

    // 判断是否为左值引用

    if (std::is_lvalue_reference<T>::value) {

        std::cout << "T是左值引用类型" << std::endl;

    } else {

        std::cout << "T不是左值引用类型" << std::endl;

    }

}


// 非转发引用示例

template<typename T>

void non_forward_reference_example(const T& param) {

    std::cout << "\n非转发引用示例: const T& param" << std::endl;

    std::cout << "参数类型: " << typeid(param).name() << std::endl;

}


void test_forwarding_references() {

    std::cout << "\n=== 转发引用(通用引用) ===" << std::endl;

    

    int x = 42;

    const int cx = 100;

    const int& cr = x;

    

    // 测试左值

    std::cout << "\n1. 传递左值 int:" << std::endl;

    forward_reference_example(x);

    

    std::cout << "\n2. 传递const int:" << std::endl;

    forward_reference_example(cx);

    

    std::cout << "\n3. 传递左值引用 const int&:" << std::endl;

    forward_reference_example(cr);

    

    // 测试右值

    std::cout << "\n4. 传递右值 200:" << std::endl;

    forward_reference_example(200);

    

    std::cout << "\n5. 传递std::move(x):" << std::endl;

    forward_reference_example(std::move(x));

    

    // 与非转发引用对比

    std::cout << "\n=== 与非转发引用对比 ===" << std::endl;

    non_forward_reference_example(x);

    non_forward_reference_example(300);

}

```


## 三、完美转发机制


### 1. std::forward完美转发实现


完美转发保持参数的值类别(左值/右值)不变,是C++11移动语义的核心机制。


```cpp

#include <memory>


// 自定义forward实现,理解其原理

template<typename T>

T&& my_forward(typename std::remove_reference<T>::type& arg) noexcept {

    std::cout << "my_forward: 转发左值引用" << std::endl;

    return static_cast<T&&>(arg);

}


template<typename T>

T&& my_forward(typename std::remove_reference<T>::type&& arg) noexcept {

    static_assert(!std::is_lvalue_reference<T>::value, 

                  "不能将右值转发为左值");

    std::cout << "my_forward: 转发右值引用" << std::endl;

    return static_cast<T&&>(arg);

}


// 接收函数,用于测试转发

void process_value(int& value) {

    std::cout << "process_value: 处理左值 " << value << std::endl;

    value *= 2;

}


void process_value(int&& value) {

    std::cout << "process_value: 处理右值 " << value << std::endl;

    // 右值可以安全地移动

}


void process_value(const int& value) {

    std::cout << "process_value: 处理const左值 " << value << std::endl;

}


// 完美转发包装函数

template<typename T>

void perfect_forward_wrapper(T&& arg) {

    std::cout << "\n包装函数接收参数" << std::endl;

    std::cout << "参数类型 T: " << typeid(T).name() << std::endl;

    

    // 使用std::forward完美转发

    process_value(std::forward<T>(arg));

    

    // 对比不使用forward的情况

    std::cout << "不使用forward: ";

    process_value(arg);  // arg始终是左值

}


// 多个参数的完美转发

template<typename... Args>

void multi_arg_forward(Args&&... args) {

    std::cout << "\n多参数完美转发" << std::endl;

    // 使用折叠表达式展开参数包

    (process_value(std::forward<Args>(args)), ...);

}


void test_perfect_forwarding() {

    std::cout << "\n=== 完美转发机制 ===" << std::endl;

    

    int x = 10;

    const int cx = 20;

    

    std::cout << "\n1. 转发左值:" << std::endl;

    perfect_forward_wrapper(x);

    std::cout << "转发后x的值: " << x << std::endl;

    

    std::cout << "\n2. 转发const左值:" << std::endl;

    perfect_forward_wrapper(cx);

    

    std::cout << "\n3. 转发右值:" << std::endl;

    perfect_forward_wrapper(30);

    

    std::cout << "\n4. 转发std::move(x):" << std::endl;

    perfect_forward_wrapper(std::move(x));

    

    // 测试自定义forward

    std::cout << "\n5. 测试自定义my_forward:" << std::endl;

    int y = 50;

    process_value(my_forward<int&>(y));

    process_value(my_forward<int>(100));

    

    // 测试多参数转发

    std::cout << "\n6. 多参数完美转发测试:" << std::endl;

    multi_arg_forward(x, 200, std::move(y));

}

```


### 2. 完美转发在工厂函数中的应用


```cpp

// 产品基类

class Product {

public:

    virtual void use() = 0;

    virtual ~Product() = default;

};


// 具体产品

class ConcreteProductA : public Product {

    std::string data;

public:

    ConcreteProductA(const std::string& d) : data(d) {

        std::cout << "构造ConcreteProductA: " << data << std::endl;

    }

    

    ConcreteProductA(std::string&& d) : data(std::move(d)) {

        std::cout << "移动构造ConcreteProductA: " << data << std::endl;

    }

    

    void use() override {

        std::cout << "使用产品A: " << data << std::endl;

    }

};


class ConcreteProductB : public Product {

    int value;

    double precision;

public:

    template<typename T1, typename T2>

    ConcreteProductB(T1&& v, T2&& p) 

        : value(std::forward<T1>(v)), 

          precision(std::forward<T2>(p)) {

        std::cout << "构造ConcreteProductB: value=" << value 

                  << ", precision=" << precision << std::endl;

    }qj.zhongfangtec.com<<hl.zhongfangtec.com<cw.zhongfangtec.com

    

    void use() override {

        std::cout << "使用产品B: " << value << " (" << precision << ")" << std::endl;

    }

};


// 完美转发的工厂函数

template<typename T, typename... Args>

std::unique_ptr<T> make_product(Args&&... args) {

    std::cout << "\n工厂函数创建产品" << std::endl;

    

    // 使用完美转发将参数传递给构造函数

    return std::unique_ptr<T>(

        new T(std::forward<Args>(args)...)

    );

}


// 可变参数工厂(C++14风格,但展示完美转发思想)

template<typename T, typename... Args>

auto make_product_modern(Args&&... args) {

    std::cout << "\n现代工厂函数创建产品" << std::endl;

    

    // 使用std::make_unique(C++14)

    // 这里演示原理,实际使用std::make_unique

    return std::unique_ptr<T>(

        new T(std::forward<Args>(args)...)

    );

}


void test_factory_with_forwarding() {

    std::cout << "\n=== 完美转发在工厂模式中的应用 ===" << std::endl;

    

    // 创建产品A - 传递左值

    std::string name = "测试产品";

    auto productA1 = make_product<ConcreteProductA>(name);

    productA1->use();

    

    // 创建产品A - 传递右值

    auto productA2 = make_product<ConcreteProductA>("临时产品");

    productA2->use();

    

    // 创建产品B - 混合参数

    int val = 100;

    auto productB1 = make_product<ConcreteProductB>(val, 3.14159);

    productB1->use();

    

    // 创建产品B - 传递右值

    auto productB2 = make_product<ConcreteProductB>(200, std::move(2.71828));

    productB2->use();

    

    // 创建产品B - 全部右值

    auto productB3 = make_product<ConcreteProductB>(300, 1.414);

    productB3->use();

}

```


## 四、可变参数模板


### 1. 可变参数模板基础


可变参数模板允许模板接受任意数量和类型的参数。


```cpp

// 基础可变参数模板示例

template<typename... Args>

void variadic_print(Args... args) {

    std::cout << "参数数量: " << sizeof...(Args) << std::endl;

    std::cout << "参数包大小: " << sizeof...(args) << std::endl;

}


// 递归展开参数包

void print() {

    std::cout << std::endl;  // 递归终止函数

}


template<typename T, typename... Args>

void print(T first, Args... rest) {

    std::cout << first << " ";

    print(rest...);  // 递归调用

}


// 使用折叠表达式展开参数包(C++17)

template<typename... Args>

void print_fold(Args... args) {

    (std::cout << ... << args) << std::endl;  // 一元右折叠

}


template<typename... Args>

void print_fold_comma(Args... args) {

    ((std::cout << args << ", "), ...) << std::endl;  // 逗号折叠

}


void test_variadic_templates() {

    std::cout << "\n=== 可变参数模板基础 ===" << std::endl;

    

    // 测试基本可变参数函数

    variadic_print(1, 2.0, "hello", 'A');

    variadic_print();  // 空参数包

    

    std::cout << "\n递归展开参数包:" << std::endl;

    print(1, 2.5, "测试", 'X', true);

    

    std::cout << "\n折叠表达式展开:" << std::endl;

    print_fold(1, " ", 2.5, " ", "fold");

    print_fold_comma(1, 2.5, "hello", 'A');

    

    // 变参模板类

    std::cout << "\n变参模板类测试:" << std::endl;

    std::tuple<int, double, std::string> my_tuple(10, 3.14, "tuple");

    std::cout << "tuple size: " << std::tuple_size<decltype(my_tuple)>::value 

              << std::endl;

}

```


### 2. 可变参数模板高级应用


```cpp

#include <tuple>

#include <functional>


// 变参模板类:类型列表

template<typename... Types>

struct TypeList {};


// 计算类型列表中类型的数量

template<typename List>

struct TypeListSize;


template<typename... Types>

struct TypeListSize<TypeList<Types...>> 

    : std::integral_constant<std::size_t, sizeof...(Types)> {};


// 获取类型列表中的第N个类型

template<std::size_t N, typename List>

struct TypeAt;


template<std::size_t N, typename First, typename... Rest>

struct TypeAt<N, TypeList<First, Rest...>> 

    : TypeAt<N-1, TypeList<Rest...>> {};


template<typename First, typename... Rest>

struct TypeAt<0, TypeList<First, Rest...>> {

    using type = First;

};


// 变参模板函数:参数打包和解包

template<typename... Args>

auto make_tuple_and_process(Args&&... args) {

    // 创建tuple

    auto my_tuple = std::make_tuple(std::forward<Args>(args)...);

    

    std::cout << "创建的tuple大小: " << std::tuple_size<decltype(my_tuple)>::value 

              << std::endl;

    

    // 使用std::apply解包tuple调用函数

    auto result = std::apply([](auto&&... elements) {

        std::cout << "解包后的元素: ";

        ((std::cout << elements << " "), ...);

        std::cout << std::endl;

        

        // 返回所有元素的和(如果可能)

        return (elements + ...);  // 折叠表达式求和

    }, my_tuple);

    

    return std::make_pair(my_tuple, result);

}


// 变参模板与完美转发结合

template<typename Func, typename... Args>

auto invoke_with_logging(Func&& func, Args&&... args) {

    std::cout << "\n调用函数,参数数量: " << sizeof...(Args) << std::endl;

    

    // 记录参数

    std::cout << "参数: ";

    ((std::cout << args << " "), ...);

    std::cout << std::endl;

    

    // 使用完美转发调用函数

    auto result = std::forward<Func>(func)(std::forward<Args>(args)...);

    

    std::cout << "函数返回值: " << result << std::endl;

    return result;

}


void test_advanced_variadic() {

    std::cout << "\n=== 可变参数模板高级应用 ===" << std::endl;

    

    // 测试TypeList

    using MyTypes = TypeList<int, double, std::string, char>;

    std::cout << "TypeList大小: " << TypeListSize<MyTypes>::value << std::endl;

    

    using FirstType = typename TypeAt<0, MyTypes>::type;

    using SecondType = typename TypeAt<1, MyTypes>::type;

    std::cout << "第一个类型: " << typeid(FirstType).name() << std::endl;

    std::cout << "第二个类型: " << typeid(SecondType).name() << std::endl;

ny.zhongfangtec.com<at.zhongfangtec.com<dz.zhongfangtec.com

    

    // 测试tuple打包解包

    std::cout << "\nTuple打包解包测试:" << std::endl;

    auto [tup, sum] = make_tuple_and_process(1, 2.5, 3, 4.2);

    std::cout << "tuple求和结果: " << sum << std::endl;

    

    // 测试带日志的函数调用

    std::cout << "\n带日志的函数调用:" << std::endl;

    auto add = [](int a, int b, int c) {

        return a + b + c;

    };

    

    auto multiply = [](double a, double b) {

        return a * b;

    };

    

    int result1 = invoke_with_logging(add, 10, 20, 30);

    double result2 = invoke_with_logging(multiply, 2.5, 4.0);

    

    std::cout << "\n最终结果: " << result1 << ", " << result2 << std::endl;

}


// 变参模板实现printf风格函数

template<typename... Args>

void printf_style(const char* format, Args... args) {

    // 简化版,实际实现需要更复杂的解析

    std::cout << "格式化字符串: " << format << std::endl;

    std::cout << "参数: ";

    ((std::cout << args << " "), ...);

    std::cout << std::endl;

    

    // 这里可以添加真正的格式化逻辑

}

```


### 3. 变参模板在实际项目中的应用


```cpp

// 变参模板实现工厂注册系统

class ObjectFactory {

private:

    using CreatorFunc = std::function<std::unique_ptr<Product>()>;

    std::unordered_map<std::string, CreatorFunc> creators;

    

public:

    // 注册创建函数

    template<typename T, typename... Args>

    void register_type(const std::string& name, Args&&... default_args) {

        creators[name] = [default_args...]() {

            return std::make_unique<T>(default_args...);

        };

    }

    

    // 创建对象

    std::unique_ptr<Product> create(const std::string& name) {

        auto it = creators.find(name);

        if (it != creators.end()) {

            return it->second();

        }

        return nullptr;

    }

};


void test_factory_system() {

    std::cout << "\n=== 变参模板在工厂系统中的应用 ===" << std::endl;

    

    ObjectFactory factory;

    

    // 注册不同类型的产品,使用不同的构造函数参数

    factory.register_type<ConcreteProductA>("ProductA", "默认名称");

    factory.register_type<ConcreteProductB>("ProductB", 100, 1.0);

    

    // 创建产品

    auto product1 = factory.create("ProductA");

    if (product1) {

        product1->use();

    }

    

    auto product2 = factory.create("ProductB");

    if (product2) {

        product2->use();

    }

    

    // 注册另一个配置的ProductB

    factory.register_type<ConcreteProductB>("ProductB2", 200, 2.5);

    auto product3 = factory.create("ProductB2");

    if (product3) {

        product3->use();

    }

}


int main() {

    test_type_categories();

    test_type_relationships();

    test_decltype_features();

    test_reference_collapsing();

    test_forwarding_references();

    test_perfect_forwarding();

    test_factory_with_forwarding();

    test_variadic_templates();

    test_advanced_variadic();

    test_factory_system();

    

    return 0;

}

```


## 五、综合应用与最佳实践


### 1. 现代C++类型安全实践


```cpp

// 类型安全的变参函数包装器

template<typename ResultType, typename... Args>

class SafeFunctionWrapper {

    std::function<ResultType(Args...)> func;

    

public:

    template<typename Func>

    SafeFunctionWrapper(Func&& f) 

        : func(std::forward<Func>(f)) {}

    

    template<typename... CallArgs>

    ResultType operator()(CallArgs&&... args) {

        static_assert(

            std::is_convertible_v<std::tuple<CallArgs...>, 

                                 std::tuple<Args...>>,

            "参数类型不匹配"

        );

        

        return func(std::forward<CallArgs>(args)...);

    }

};


// 使用示例

void test_safe_wrapper() {

    auto add = [](int a, int b) -> double {

        return static_cast<double>(a + b);

    };

    

    SafeFunctionWrapper<double, int, int> safe_add(add);

    

    // 正确调用

    double result1 = safe_add(10, 20);

    std::cout << "10 + 20 = " << result1 << std::endl;

    

    // 类型转换调用

    double result2 = safe_add(10.5, 20.7);  // 转换为int

    std::cout << "10.5 + 20.7 (转换为int) = " << result2 << std::endl;

    

    // 以下代码会在编译时失败

    // safe_add("10", "20");  // 编译错误:参数类型不匹配

}

```


### 2. 性能优化建议


1. **合理使用完美转发**:避免不必要的拷贝

2. **选择适当的引用类型**:根据使用场景选择左值/右值引用

3. **避免过度模板化**:模板实例化可能增加编译时间和代码体积

4. **使用移动语义**:对于临时对象使用std::move

5. **注意类型推导规则**:理解auto和decltype的区别


### 3. 调试与错误处理技巧


1. **使用static_assert进行编译时检查**

2. **利用typeid和type_traits进行类型调试**

3. **编写类型特征测试工具函数**

4. **注意模板实例化错误信息**


C++11的类型系统增强为现代C++编程提供了强大的类型安全和性能优化能力。通过深入理解引用折叠、完美转发和可变参数模板,开发者可以编写出更高效、更灵活的代码。这些特性不仅是语法糖,更是构建高性能、可维护软件系统的重要工具。


在实际开发中,应当根据具体需求合理选择和使用这些特性,平衡类型安全、性能和代码可读性。通过不断实践和经验积累,这些现代C++特性将成为解决复杂问题的重要工具。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3105504/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933682