大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
-
功能
-
类型规则
-
声明类型分析
-
案例一
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
进行索引返回的是引用,引用类型必须初始化,所以报错。
-
-
复杂表达式
-
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]; }
-
支持引用
template <typename T,typename I> decltype(auto) show(T& a, I i) { return a[i]; }
-
支持右值引用
template <typename T,typename I> decltype(auto) show(T&& a, I i) { return a[i]; }
- 支持右值,但是这里的
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
-
总结
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195527.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...