C++ 11 的一些新特性

简介: 学习 C++ 11 中使用的一些新特性都通通记录下来!😤

欢迎大家来我的博客逛逛👏:hauhau.cn

原始字面量

R("string...")

示例:

#include <iostream>

int main() {
    std::string str = R"(../../text.cc
    
    上面换了个行)";
    std::cout << str << std::endl;
}

[Running] cd "/root/code-server/c11-new/" && g++ 字符串字面量.cc -o 字符串字面量 && "/root/code-server/c11-new/"字符串字面量
../../text.cc
    
    上面换了个行

[Done] exited with code=0 in 0.269 seconds

nullptr

这个没什么好说的,替换 NULL 使用即可,这玩意不等于 0

auto & decltype 自动推导

auto 只能推导初始化了的变量

decltype 根据表达式进行推导: decltype (表达式)

decltype 的特殊情况:

  • 如果表达式为函数调用,则推导的类型和函数返回值相同
  • 如果表达式为左值或者被 () 包围,推导出来的是表达式类型的引用

骚操作:

  • 返回类型后置
/**
 * @brief 阻塞等待 set_value
 * @return ret_type
 */
auto get_return() -> decltype(p_.get_future().get()) {
  return p_.get_future().get();
}
  • 使用 decltype 的推导规则进行类型推导,auto 有些时候会推导错误
/**
 * @brief 阻塞等待 set_value
 * @return ret_type
 */
decltype(auto) get_return() {
  return p_.get_future().get();
}

final & override

没啥好说的

函数模板默认参数

如题:

template<typename ret_type=int>
decltype(auto) get_return(ret_type _ret) {
  return _ret
}

要注意的是,函数模板默认参数没有函数默认参数的默认参数都必须在右边的限制,想放哪就放哪

委托构造函数

允许构造函数调用其他构造函数,建议在初始化列表中使用

public:
  explicit TestTask(std::string _name) : name_(std::move(_name)) {};
  TestTask(std::string _name, const std::string& _text) : TestTask(std::move(_name)) {
    std::cout << _text << std::endl;
  }

继承构造函数

派生类可以直接使用基类的构造函数: using qualifier::name;

class TestTask : public XTask<std::string> {
    public:
      std::string name_;

  public:
      TestTask() = default;
      explicit TestTask(std::string _name) : name_(std::move(_name)){};
}

class Task : public TestTask {
    public:
        using TestTask::TestTask;
};

也可以通过这种方式来使用基类的隐藏的同名函数

std::initializer_list

一个轻量的类模板,通过这个模板可以实现任意长度参数的传递

传参的时候可以通过实例化 std::initializer_list 或者使用初始化列表 { } 来进行传参

#include <iostream>

template<typename T>
void set_return(std::initializer_list<T> _list) {
  for (const auto &i : _list){
    std::cout << i;
  }
  std::cout << std::endl;
}

int main() {
  std::initializer_list<int> list{1, 2, 3, 4, 5};
  set_return(list);
  set_return({1, 2, 3, 4, 5});

  return 0;
}

同时也可以在构造函数中使用 std::initializer_list 来传递多个实参

for

for (const auto &i : _list){
  std::cout << i;
}

其实就是使用迭代器来遍历容器

for (auto it = _list.begin(); it != _list.end(); ++it){
  std::cout << i;
}

包装器和绑定器

右值引用

  • 左值:放在内存、有明确存储地址(可以取地址)的数据
  • 右值:可以提供数据值的数据(不可以取地址)

人话:能对表达式取地址的是左值,否则为右值,即:有名字的变量或对象都是左值,右值都是匿名的

右值又分两种:

  • 将亡值 (xvalue, expiring value): 非引用返回的临时变量、运算表达式产生的临时变量、原始字面量和 lambda 表达式等
  • 纯右值 (prvalue, PureRvalue): 与右值引用相关的表达式,比如,T&& 类型函数的返回值、 std::move 的返回值等

右值引用:

class Test {
  Test() = default;
}

Test GetTest() {
    return Test();
}

int main() {
  int &&value = 666;
  Test &t = GetTest();
  Test &&t = GetTest();
  const Test &t = GetTest();
  return 0;
}

666 是纯右值,int &&value = 666; 没毛病

Test &t = GetTest(); 将一个右值赋值给左值引用,出大问题;Test &&t = GetTest(); 就没毛病

const Test &t = GetTest(); 有点特殊:常量左值引用是一个万能引用类型,可以接受左值、右值、常量左值、常量右值

为什么使用右值引用?

充分利用临时变量,减少不必要的拷贝

目录
相关文章
|
4月前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
4月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
573 1
|
3月前
|
编译器 C++ 开发者
C++一分钟之-C++20新特性:模块化编程
【6月更文挑战第27天】C++20引入模块化编程,缓解`#include`带来的编译时间长和头文件管理难题。模块由接口(`.cppm`)和实现(`.cpp`)组成,使用`import`导入。常见问题包括兼容性、设计不当、暴露私有细节和编译器支持。避免这些问题需分阶段迁移、合理设计、明确接口和关注编译器更新。示例展示了模块定义和使用,提升代码组织和维护性。随着编译器支持加强,模块化将成为C++标准的关键特性。
144 3
|
3月前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
48 2
|
1月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
2月前
|
数据安全/隐私保护 C++
|
3月前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
61 5
|
2月前
|
存储 安全 编译器
|
4月前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
58 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
4月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
53 1