大家好,又见面了,我是你们的朋友全栈君。
decltype
可以将给定的表达式或变量的类型推导出来,包含引用和指针。
c++11
的auto
缺陷.
案例一 int main() { int a = 0; decltype(a) b; b.error(); }
b
是int
类型.案例二 #include <cassert> int main() { const int & a = 0; decltype(a) b = a; assert(&b == &a); }
b
和a
是一个地址,是引用.案例三
#include<iostream>
class T {
public:
T() {
std::cout << "s" << this << std::endl; }
~T() {
std::cout << "e" << this << std::endl; }
};
int main() {
const T && a = T();
decltype(a) b = T();
return 0;
}
案例一 #include<vector> #include<iostream> template <typename T,typename I> auto show(T&& a, I i) -> decltype(a[i]) { std::cout << "cool" << std::endl; return std::forward<T>(a[i]); } int main() { std::vector<int> s = { 1,2,3,4 }; decltype(show("123", 1)) a = 2; return 0; }
std::cout
,因为并不会执行,在编译阶段确定了类型而已.案例二 #include<vector> int main() { std::vector<int> s = { 1,2,3,4 }; decltype(s[1]) a; return 0; }
vector
进行索引返回的是引用,引用类型必须初始化,所以报错。案例一 int main() { decltype((1+2+3+4)) a = 1; return 0; }
int
类型.案例二 int main() { int a = 1; decltype((a)) b = 1; return 0; }
(var)
操作得到的是对应的引用类型,C++11
的新特性.
decltype
的真正作用组合后的返回值,复杂表达式。 说明
std::vector
进行[]
,返回的一般都是&
类型,但是bool
则例外.简单代码 template <typename T,typename I> auto show(T& a, I i) ->decltype(a[i]) { return a[i]; }
好看点 template <typename T,typename I> auto show(T& a, I i) { return a[i]; }
C++14
才支持,而且有点小问题.auto
推导,C++11
仅仅支持简单的单个表达式推导,不支持复杂的组合表达式.
C++14
支持,C++14
这里正常编译.
auto
不支持引用类型推导.这里是基本类型,是个右值。支持引用 template <typename T,typename I> decltype(auto) show(T& a, I i) { return a[i]; }
auto
表示类型推导,decltype
表示按照decltype
的规则进行,即何在一起就是支持引用类型推导。
const
就可以支持右值,但是又不是这里讨论的手段,因为无法区分是操作的左值还是右值。a
是左值,非匿名消亡值.a[i]
返回引用,show
执行完就消亡,那么会导致引用悬空.完善最终版 template <typename T,typename I> decltype(auto) show(T&& a, I i) { return std::forward<T>(a)[i]; }
void show() && { } void show() &{ } 不同修饰调用不同的函数
&&,const,volatile,&
,也可以任意组合.show()&
就不能定义show()
这种.C++11
()
()
,得到的是一个引用类型.decltype
得到的是声明的类型.
C++14
允许decltype(auto)
组合完美的推测.C++11
可以通过后置的方式达到同样的效果.C++14
更加简洁.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195527.html原文链接:https://javaforall.cn