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
是类型的占位符,而不是 const
、volatile
或引用说明符。
使用 auto
的一些优势包括:
- 变量总是被初始化
- 确保在没有任何隐式转换的情况下使用正确的类型
- 减少输入并关注实际类型
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
是类型的占位符,而不是 const
、volatile
或引用说明符。
使用 auto
的一些优势包括:
- 变量总是被初始化
- 确保在没有任何隐式转换的情况下使用正确的类型
- 减少输入并关注实际类型