📅  最后修改于: 2023-12-03 14:39:58.810000             🧑  作者: Mango
在 C++11 中,引入了两种类型推断方式:自动类型推断(auto) 和 decltype。它们可以让编译器自动推导出某个变量的类型,从而简化代码。
auto
关键字可以让编译器根据变量的初始值推断出变量的类型。例如:
auto i = 42; // i 的类型被推断为 int
auto d = 3.14; // d 的类型被推断为 double
auto
推断的变量类型与初始值的类型相关。例如:
auto i = 42; // i 的类型被推断为 int
i = 3.14; // 错误,int 类型的 i 不能存储 double 类型的值
因此,我们需要在定义变量时根据需要显式指定变量类型或使用类型转换。
auto
也可以用于定义迭代器或模板变量的类型。例如:
std::vector<int> vec = {1, 2, 3};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::unordered_map<std::string, int> my_map = {{"apple", 1}, {"banana", 2}};
for (const auto& p : my_map) {
std::cout << p.first << ": " << p.second << '\n';
}
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
在第 1 个例子中,auto
被用于定义迭代器 it
的类型;在第 2 个例子中,auto
被用于定义 p
的类型。
decltype
关键字可以让编译器根据表达式的类型推导出变量的类型。例如:
int x = 0;
decltype(x) y; // y 的类型被推导为 int
decltype
还可以用于推断函数返回值类型。例如:
int x = 0;
decltype(x + 0) add() {
return x + 10;
}
decltype
推断的变量类型与表达式的类型相关。例如:
int x = 0;
const int& crx = x;
decltype(crx) y = 10; // y 的类型被推导为 const int&
需要注意的是,如果表达式的类型是个纯右值,那么 decltype
推导出的类型会是右值引用类型。
int&& f() { return 10; }
decltype(f()) x = f(); // x 的类型被推导为 int&&
自动类型推断和 decltype
是 C++11 中引入的两种类型推断方式。使用它们可以让代码更简洁、更易读。需要注意的是,自动类型推断和 decltype
推导出的类型与初始值或表达式的类型相关。