C++面试-auto,auto,auto 的区别
C++面试-auto,auto&,auto &&的区别
顶层const 和底层const
-
顶层const 作用于变量本身,该变量不可修改。
-
底层const作用 指向或引用的对象,不能通过改变量修改指向的对象。
-
基本类型只有顶层const;
-
引用只有底层const
-
指针的const
const int* p = &x; // 底层-》左定值(*左边是const,值确定)
int const p = &x;//顶层 -》右定向(**右边是const,指针指向确定)
#include <iostream>
#include <utility>template <typename T>
void fun(T &&t)
{auto &&a = std::forward<T>(t);
}
int main()
{// 1.auto 值类型推导{int a = 1;auto va = a; // intconst int b = a;auto vb = a; // intconst int *p1 = &a;auto ap1 = p1; // const int *int *const p2 = &a;auto ap2 = p2; // int *const char name[] = {"hello"};auto aname = name; // const char *}// auto & 左值引用推导{int a = 1;auto &va = a; // int &const int b = a;auto &vb = a; // const int&const int *p1 = &a;auto &ap1 = p1; // const int *&int *const p2 = &a;auto &ap2 = p2; // int * const &const char name[] = {"hello"};auto &aname = name; // const char &[5]}// auto && 万能引用推导{auto &&a = 1; // int &&}return 0;
}
总结:
区别:
1.推导类型
auto:值类型
auto&:左值引用
auto && :万能引用
2.const 处理
auto:忽略顶层const
auto&:都保留
auto && :都保留
3:数组退化:
auto:数组退化为指针
auto&:都保留
auto && :都保留
4.应用场景:
auto:简单值拷贝
auto&:避免拷贝
auto && :泛型编程 左值-》左值引用 右值-》右值引用