C++11中auto和decltype
2021-02-09 本文已影响0人
突击手平头哥
C++11中auto和decltype
auto
和decltype
都是C++11中引进来用于自动推断类型的关键字,但又略有不同;个人认为C++引入越来越多的概念,但是并不需要全部非常深入了解,比如:菱形继承;在编程实践当中,代码可读性是很重要的;不过auto
这种带来便利的关键字还是要了解的;另外说明一下,在C语言中,使用 auto 修饰的变量,是具有自动存储器的局部变量,这个有时间说明下吧!
简单示例
int main() {
auto a = 1;
decltype(main()) b = 1;
return 0;
}
-
auto
并未引入新的功能,因为C++
代码中我们必然是知道函数的传参、返回参数的,更多的好处是免去写一长串类型;和多态类似,在编译中由编译器确定类型 -
decltype
可以根据表达式来推断类型,实际上并未执行
初始化
C++
中函数不同参数类型多态的实现是在编译时推断类型,然后添加一些特定的后缀然后将函数编译成不同的符号,实际上多态函数是会被编译出多个的;decltype
是推断变量,那auto
在未初始化的情况下是怎么样的呢?
int main() {
//auto a; //编译错误
decltype(main()) b;
return 0;
}
C/C++
并没有运行在一些解释器上,很多时候代码的执行是较为透明的;auto
定义但是未初始化的情况肯定是不行的,那么如果在后面初始化呢?答案是也不行,还没这么智能
指针
C/C++
中引用、指针是不可绕过的,在使用上会有什么区别吗?
int main() {
int t = 10;
int *ptr = &t;
auto a = ptr;
auto * b = ptr;
printf("a : %d, b : %d\n", *a, *b);
decltype(&t) c = ptr;
decltype(t)* d = ptr;
//decltype(t) e = ptr;
printf("c : %d, d : %d\n", *c, *d);
return 0;
}
对于auto
来说加不加*
没有区别,均能表示指针;对于decltype
来说就比较明确了,没有隐含的操作
引用
int main() {
int num0 = 10;
int& num1 = num0;
auto a = num0;
printf("a: %u, num: %u\n", &a, &num0);
decltype(num1) b = num0;
printf("b: %u, num: %u\n", &b, &num0);
//decltype(*(&num0)) c;
std::remove_reference<decltype(*(&num0))>::type c;
return 0;
}
a: 1172783724, num: 1172783720
b: 1172783720, num: 1172783720
可知,auto
声明引用时必须明确带引用的符号,而decltype
能明确推导出引用类型;此外对于解引用操作,decltype
推导出来的就是引用,auto`正常使用
当然对于引用的问题可以使用remove_reference
来实现,但是反而更复杂了
缺陷
-
auto
不能当作函数的参数;事实上也没必要,可以用模板 - 如果初始表达式带有
const/volatile
,auto
推到的类型会去掉这些语义;如果使用auto &
推导,则不去掉const
语义 -
C
语言中auto
的功能被去除 -
auto
不能用于类成员变量