侯捷 C++ 课程学习笔记:Spaces in Template Expression、 nullptr and stdnull

一、模板表达式中的空格

在 C++11 之前,模板表达式中需要在两个闭合的模板参数之间加空格,以避免编译器解析错误。例如:

cpp 复制代码
vector<list<int> >;  // OK in each C++ version

在 C++11 及之后的版本中,这种要求已经被取消,可以写成:

cpp 复制代码
vector<list<int>>;  // OK since C++11

这种变化简化了模板表达式的书写,提高了代码的可读性。

二、nullptrstd::nullptr_t

C++11 引入了 nullptr 关键字,用于表示空指针。nullptr 是一个类型安全的空指针常量,可以用于任何指针类型,但不能用于整数类型。这避免了使用 NULL0 时可能产生的类型不匹配问题。

cpp 复制代码
void f(int);
void f(void*);

f(0);  // calls f(int)
f(NULL);  // calls f(int) if NULL is 0, ambiguous otherwise
f(nullptr);  // calls f(void*)

nullptr 的类型是 std::nullptr_t,定义在 <cstddef> 中。std::nullptr_t 是一个基本数据类型,可以用于重载函数和模板。

cpp 复制代码
#include <cstddef>

typedef decltype(nullptr) nullptr_t;  // 定义在 <cstddef> 中
三、自动类型推导(auto

C++11 引入了 auto 关键字,允许在声明变量时自动推导其类型。这在处理复杂类型或长类型名称时特别有用。

cpp 复制代码
auto i = 42;  // i 的类型为 int
double f();
auto d = f();  // d 的类型为 double

auto 也可以用于函数返回类型的推导:

cpp 复制代码
auto add(int a, int b) -> int {
    return a + b;
}

在 C++11 中,auto 还可以用于 lambda 表达式的类型推导:

cpp 复制代码
auto lambda = [](int x) -> bool {
    return x > 0;
};

auto 的使用简化了代码,提高了可读性,特别是在处理复杂类型时。

四、学习心得

通过学习,我对 C++11 的新特性有了更深入的理解。这些新特性,如模板表达式中的空格简化、nullptrstd::nullptr_t、自动类型推导(auto),都极大地提高了代码的可读性和安全性。

在实际编程中,合理使用这些新特性可以简化代码,减少错误,提高开发效率。例如,使用 nullptr 可以避免空指针的类型不匹配问题,使用 auto 可以简化复杂类型的声明,提高代码的可读性。

相关推荐
云知谷1 小时前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
仰泳的熊猫1 小时前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
^Moon^1 小时前
CycloneDDS:跨主机多进程通信全解析
c++·分布式·dds
l1t2 小时前
DeepSeek辅助利用搬移底层xml实现快速编辑xlsx文件的python程序
xml·开发语言·python·xlsx
递归不收敛3 小时前
大语言模型(LLM)入门笔记:嵌入向量与位置信息
人工智能·笔记·语言模型
冷雨夜中漫步3 小时前
高级系统架构师笔记——数据库设计基础知识(5)Armstrong公理系统、无损连接和有损连接
笔记·系统架构
C_Liu_3 小时前
C++:list
开发语言·c++
my rainy days3 小时前
C++:友元
开发语言·c++·算法
deng-c-f3 小时前
Linux C/C++ 学习日记(28):KCP协议(四):如何实现更复杂的业务:将连接状态的管理进行封装,用户只需实现发送、接收、断开的处理逻辑。
学习·网络编程·kcp
小梁努力敲代码3 小时前
java数据结构--List的介绍
java·开发语言·数据结构