美文网首页
C++11中auto和decltype

C++11中auto和decltype

作者: 突击手平头哥 | 来源:发表于2021-02-09 20:45 被阅读0次

C++11中auto和decltype

autodecltype都是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/volatileauto推到的类型会去掉这些语义;如果使用auto &推导,则不去掉const语义
  • C语言中auto的功能被去除
  • auto不能用于类成员变量

相关文章

  • C++11中auto和decltype

    C++11中auto和decltype auto和decltype都是C++11中引进来用于自动推断类型的关键字,...

  • C++11的类型推导详解

    auto & decltype 关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decl...

  • C++11拾穗

    C++11新关键字 alignas:指定对齐大小 alignof:获取对齐大小 decltype auto(重新定...

  • 模板函数返回类型的演进

    提纲 c++03: trick 方法 c++11: auto->decltype 组合 c++14: 自动推导模板...

  • C++11类型推导

    C++11 重新定义了auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。 au...

  • C++11 类型推导,auto和decltype

    本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。 a...

  • C++雾中风景10:聊聊左值,纯右值与将亡值

    C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的...

  • auto && decltype

    auto:C++11标准引入的类型说明符,编译器通过初始值来推算变量的类型。因此,auto定义的变量必须有初始值a...

  • auto & decltype

    使用auto和decltype来实现实参推断时,遇到下面case: 执行结果为: 如果把sum中的注释的cout打...

  • c++ 11~20 新特性速查

    持续更新中。。。 c++11 std::auto (c++11) raw string (c++11) std::...

网友评论

      本文标题:C++11中auto和decltype

      本文链接:https://www.haomeiwen.com/subject/yibcxltx.html