📜  C++中的类型推断(自动和DECLTYPE)(1)

📅  最后修改于: 2023-12-03 14:39:58.810000             🧑  作者: Mango

C++ 中的类型推断(自动和 decltype)

在 C++11 中,引入了两种类型推断方式:自动类型推断(auto)decltype。它们可以让编译器自动推导出某个变量的类型,从而简化代码。

自动类型推断(auto)

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

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 推导出的类型与初始值或表达式的类型相关。