《C++ 模板》翻译: 1.2 模板参数推导

2020/05/25

当我们使用参数调用 max() 这样的模板时,模板参数就由我们传递的参数确定下来。如果我们给参数类型 T 传两个 int ,C++ 编译器就会推断出 T 一定是 int 。但是, T 可能只是这个类型的 “一部分” 。例如,我们声明 max() 的参数为常量引用:

然后传递 int 类型参数, T 还是会被推导成 int ,因为函数参数 int const& 相匹配。

类型推导中的类型转换
注意, 在类型推导过程中,禁止了类型自动转换:

  • 当声明为引用类型参数时,任何一丢丢的类型转换都不适用于类型推导。使用相同模板参数 T 声明的两个参数必须完全匹配
  • 当声明为值类型参数时,只支持 退化(decay) 这一种普通的转换。const 或 volatile 限定符会被忽略,引用转换为被引用的类型,原始数组和函数会被退化为相应类型的指针。两个使用相同的模板参数 T 的 退化 也必须相同。

阅读全文…

《C++ 模板》翻译: 1.1 初识函数模板

2020/05/24

本章介绍函数模板。 函数模板是参数化的函数,它们表示一系列函数

1.1 初始函数模板

函数模板的的的提供了可为不同的类型调用函数行为,换名话说,函数模板表示一系列函数。这表示它看起来像个普通函数,除了某些元素是不确定的:这些元素是参数化(parameterized)的。为说明这点,我们来看些例子

1.1.1 定义模板

下面是一个函数模板,经返回两个值中的最大值:

这个模板定义了一系列函数,它们返回两个值中的最大值,这两个值通过函数的参数 a 和 b1 传递。这些参数的类型为 template parameter T [?.1] . 正如上例所示,模板参数需要使用如下语法声明:

在本例中,参数列表为 typename T . 注意这里尖括号 < > 是如何使用的, 而关键词 typename 引入了 类型参数(type parameter)。 目前为止,这是 C++编程中最常见的一种模板参数,但也可以使用其它参数,这点我们稍后讨论(参见第 3 章)

阅读全文…

《C++ 模板》翻译: 第一部分 基础

2020/05/24

此部分介绍 C++ 模板的一般概念与语言特性。我们首先通过展示函数模板和类模板的例子来讨论一般的目标和概念,然后是是附属的基础模板特性, 如 非类型模板参数(nontype template parameters)、可变参数模板(variadic templates,)、typename 关键字 和 成员模板。我们也会讨论如何处理 移动语义(move semantics), 如何定义参数, 以及如何在 编译时编程(compile-time programming) 使用泛型代码 。最后给出了一些关于术语的一般性提示,以及作为应用程序的程序员和泛型库作者在实践中使用和应用模板的提示。

阅读全文…

《C++ 模板》翻译: 序

2020/05/24

疫情期间在家,打算重新理一下 C++ 模板的相关知识,入手的这本 _C++ Templates 第二版_ 没有中文版,打算自己学习的过程顺手翻译出来。鉴于英语水平不高,翻译出来会较烂较慢,仅作为学习笔记记录于此。希望在翻译的过程中自己的英文和 C++ 模板编程能力能有所提升。

以上。

 

本书名称为 C++ Templates: The Complete Guide, 2nd Edition

 

 

 

Linux Coredump 核心转储

2019/10/14

什么是 Coredump

coredump 核心转储 ,也称为 核心文件(core file) 是操作系统在进程收到某些 信号 而终止运行时,将此进程的地址空间以内容以及有关进程状态的其他信息写出的一个文件。这种信息往往用于调试。
程序员可以通过工具来分析程序运行过程中哪里出错了:Windows 平台用 userdump 和 WinDBG ,Linux 平台使用gdb, elfdump, objdump 等

Windows WinDBG

关于 windbg, 可以参考以下资料

Linux GDB

有些时候进程在crash的时候会产生 core 文件, 但我们却找不到 core 文件,我们需要使用 ulimit 进行一些设置, 这个命令是用来限制系统用户对shell资源的访问的。
ulimit -a 可以查看当前的设置
ulimit -c 可以设置 core 文件的上限,单位为区块(一般 1 block = 512 bytes) .其值为 0 时不写入 core, 为 unlimited 时不限制 core 文件大小。
需要注意, ulimit 只对当前会话有效。若想对所有会话生效, 需要在 /etc/profile 中进行配置。

源文件如下 test_vec.cpp :

编译运行时可能出现如下现象:

使用 gdb 打开来看:

从 gdb显示的栈信息来看,崩溃发生在 main 函数内的 vector::at 函数内,由 _M_range_check raise 。
如果我们在编译时使用了 -g 选项, 会得到更详细的信息

阅读全文…

GDB 常用调试技巧

2019/10/12

1. 调试宏

宏是预编译的,无法 print 宏的定义。但是如果配合 gcc, 我们还是可以有限地调试宏。
在 GCC 编译程序的时候,加上 -g3 参数,就可以调试宏了。

  • info macro mac_name 可查看宏定义,及位置
  • macro expand mac_expr 可查看宏展开的样子

示例:

调试现场如下:

2. 修改变量

两种方法:

  1. print var_name=x
  2. set var var_name=x

示例:

阅读全文…

Note 619