auto 是一个值类型
auto& 是一个左值引用类型
auto&& 是一个转发引用类型(符合引种折叠逻辑)
decltype(a) 是一个值类型
decltype((a)) 是一个左值引用类型
decltype(a + a) 是一个值类型
从以上写法来看auto和decltype用法功能是重叠的所以尽量用auto
但是auto有个限制,你需要在写下 auto 时就决定你写下的是个引用类型还是值类型。使用 auto 不能通用地根据表达式类型来决定返回值的类型
decltype(expr) a = expr;既可以匹配一个值类型也可以匹配一个引用类型
简化写法decltype(auto) = expr;
decltype(auto) i1 = a; //i1是值类型
decltype(auto) i2 = std::move(a); //i2是右值引用类型
decltype(auto) i3 = (s.a); //i3是左值引用类型
decltype(auto) i4 = (0); //i4是值类型
注:
auto本质上匹配的是template func()的模板函数所以符合引用折叠的特点
int x = 42;
int& a = x;
int&& b = 42;
auto&& c = a; // int&
auto&& d = b; // int&
auto&& e = std::move(b); // int&&