大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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 -
总结
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195527.html原文链接:https://javaforall.net
