C++11中auto和decltype

2021-02-09  本文已影响0人  突击手平头哥

C++11中auto和decltype

autodecltype都是C++11中引进来用于自动推断类型的关键字,但又略有不同;个人认为C++引入越来越多的概念,但是并不需要全部非常深入了解,比如:菱形继承;在编程实践当中,代码可读性是很重要的;不过auto这种带来便利的关键字还是要了解的;另外说明一下,在C语言中,使用 auto 修饰的变量,是具有自动存储器的局部变量,这个有时间说明下吧!

简单示例

int main() {
    auto a = 1;
    decltype(main()) b = 1;

    return 0;
}

初始化

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来实现,但是反而更复杂了

缺陷

上一篇下一篇

猜你喜欢

热点阅读