auto类型推导
在c++11之后, 我们可以通过auto关键字来定义一个变量,使我们可以免于显式地声明其类型,让编译器在编译时自动推导该变量的类型。如果你已经读过了,那么,除了一种特殊的情况外(初始化列表std::initializer_list),其实你已经知晓了关于auto类型推导的全部内容,因为auto类型推导实际上就是模板类型推导。
模板类型推导的形式如下:
template<typename T>
void f(ParamType param)
f(expr);
当进行auto类型推导时,有:
auto x = expr;
auto& x = expr;
auto&& x = expr;
在上述示例中,auto相当于模板中的T,不同的是ParamType:
- example1中,ParamType为T,则x的类型推导规则遵循中的Case3的情况。
- example2中,ParamType为T&,则x的类型推导规则遵循中Case1的情况。
- exmaple3中,ParamType为T&&,则x的类型推导规则遵循中Case2的情况。
auto类型推导实例:
#include <iostream>
#include <memory>
#include <vector>
#include <typeinfo>
int main()
{
std::cout << std::boolalpha;
int x = 1;
auto y = x;
std::cout << "y的类型是int:" << std::is_same<decltype(y), int>::value << std::endl;
std::unique_ptr<int> ptr(new int{1});
auto uni_ptr = std::move(ptr);
std::cout << "uni_ptr是右值引用:" << std::is_rvalue_reference<decltype(uni_ptr)>::value << std::endl;
std::unique_ptr<int>& ptr_lr = uni_ptr;
auto& ptr_a1 = uni_ptr;
std::cout << "ptr_a1是左值引用:" << std::is_lvalue_reference<decltype(ptr_a1)>::value << std::endl;
auto&& ptr_a2 = uni_ptr;
std::cout << "ptr_a2是左值引用:" << std::is_lvalue_reference<decltype(ptr_a2)>::value << std::endl;
std::vector< std::unique_ptr<char>> vec;
auto a = std::make_unique<char>('a');
auto b = std::make_unique<char>('b');
auto c = std::make_unique<char>('c');
vec.push_back(std::move(a));
vec.push_back(std::move(b));
vec.push_back(std::move(c));
for (auto& elem : vec)
std::cout << *elem << " ";
puts("");
for (auto&& elem : vec)
std::cout << *elem << " ";
puts("");
system("pause");
return 0;
}