C++ 类型推断 (auto 和 decltype)

17 Mar 2025 | 4 分钟阅读

在 C 或 C++ 等编程语言中,我们声明任何变量并在编译时显式声明变量的数据类型。但是类型推断意味着我们使用一些关键字,通过这些关键字我们不需要显式声明变量或函数的数据类型。这为程序员节省了大量时间来编写变量的数据类型。它会稍微增加程序的编译时间,但这不会影响程序的运行时间。

在这里,我们将声明用于 C++ 中类型推断的以下关键字

1. auto

auto 关键字用于任何变量或任何函数之前,它会自动从其初始值获取变量或函数的数据类型。它基本上获取值初始值的表达式或函数返回值的表达式,然后确定变量的数据类型。

要声明任何 auto 变量,我们必须在声明时对其进行初始化。否则,它会给出编译时错误。

C++ 示例 1

输出

Type Inference in C++ (auto and decltype)

说明

在上面的示例中,我们使用 auto 关键字声明了三个变量 a、b 和 c。变量 a 的类型是整数,b 的类型是字符,c 的类型是双精度浮点数。

我们使用 typeid 运算符,它通过其 name() 函数返回变量的数据类型。

在输出中,我们得到 i 代表变量 a 的整数,c 代表变量 b 的字符,d 代表变量 c 的双精度浮点数。

C++ 示例 2

输出

Type Inference in C++ (auto and decltype)

说明

在上面的代码中,我们声明了三个 auto 变量,但没有在声明时初始化它们,因此它给出了编译时错误。

2. decltype()

decltype() 的工作原理与 auto 相同,但它是一个运算符,它将表达式作为参数。它评估表达式,然后设置变量或实体的数据类型。

C++ 示例 1

输出

Type Inference in C++ (auto and decltype)

说明

在上面的代码中,我们有两个函数,一个函数返回字符类型,另一个函数返回整数类型。我们使用了 decltype() 关键字并将这两个函数作为参数传递,无论它返回什么都将是数据类型,因此我们为这些数据类型声明了新变量。

现在 fxn1 的返回类型和 var1 的数据类型将相同,fxn2 的返回类型和 var2 的数据类型也相同。因此,我们使用 typeid 运算符来获取这两个变量的数据类型。

C++ 示例 2

输出

Type Inference in C++ (auto and decltype)

说明

在上面的代码中,我们有两个变量:var1 具有整数数据类型,而 var2 具有字符数据类型。我们声明了另外两个变量 var3 和 var4,其中 var3 具有与 var1 相同的数据类型,因为我们使用 decltype 关键字初始化其数据类型,而 var4 具有与 var2 相同的数据类型,因为使用了 decltype 关键字。现在我们借助 typeid 关键字打印了数据类型。

注意:decltype 关键字在编译时给出变量或实体的数据类型,而 typeid 在运行时给出数据类型。

如果我们使用继承并获取类的数据类型,那么 decltype 将返回指向基类的指针,而 typeid 将返回指向派生或子类的指针。


下一主题C++ 中的属性