C++ 强制类型推导示例

Examples of mandatory type deduction in C++

Google's C++ Style Guide 在某些时候状态:

There are several contexts in which C++ allows (or even requires) types to be deduced by the compiler.

有哪些强制类型推导的例子?

一个简单的例子是 lambda 变量的初始化。 lambda 的类型是匿名的,因此不能显式命名,必须推导:

auto var = [capture]{};

另一个例子:

struct {
    int x, y;
} g_xy;

这里g_xy是一个未命名类型的全局变量。例如,如果你尝试 return 它,你必须让编译器推断出函数的 return 类型,因为你无法命名它:

auto foo()
{
    return g_xy;
}

虽然可能的未命名类型(lamdas 除外)很少有用和使用。

还有另一个示例 - 无法指定具有 auto 个参数的通用 lambda 类型。

auto lam = [](auto v) { }

无法在调用 lambda 时指定 v 的类型。

风格指南给出了几个编译器进行自动类型推导的例子。最明显的情况是每当您使用 C++11 引入的 auto 关键字时。 auto 是实际类型的占位符。每当您使用 auto 时,编译器都会从中推断出类型: 用于初始化变量的表达式的类型;函数的 return 表达式的结尾类型或类型。

通常你会像这样声明一个变量:

int i = 0;

您在此处为变量 i 指定类型 int。但是,在现代 C++ 中,您可以在不指定变量类型的情况下声明变量,编译器将自动推导它们的类型:

auto a = 42;         // a is an int
auto& b = a;         // b is an int&
auto c = b;          // c is an int
auto d{42};          // d is an int, not a std::initializer_list<int>
auto v = {1, 2, 3};  //v is a std::initializer_list<int>

其他示例包括命名的 lambda 函数:

auto lower = [] (const char c) { return tolower(c); };

并且在 C++14 之后,一个通用的 lambda,其中 return 类型和 lambda 参数都可以是 auto:

auto add = [](const auto a, const auto b) { return a + b; }

需要注意的一件事是 auto 是类型的占位符,而不是 constvolatile 或引用说明符。

使用 auto 的一些优势包括:

  • 变量总是被初始化
  • 确保在没有任何隐式转换的情况下使用正确的类型
  • 减少输入并关注实际类型