第3章 auto占位符(C++11~C++17)
3.1 重新定义的auto关键字
在C++11中静态成员变量是可以用auto
声明并且初始化的,不过前提是auto
必须使用const
限定符。
static const auto x = 5;
遗憾的是,const限定符会导致x
常量化,显然这不是我们想要的结果。在C++17标准中,对于静态成员变量,auto
可以在没有const
的情况下使用。
C++20之前,无法在函数形参列表中使用auto
声明形参(注意,在C++14中,auto可以为lambda表达式声明形参)
void fun(auto a) // C++20之前编译错误
{
qDebug() << N;
}
int main()
{
int x = 1;
fun(x);
}
3.2 推导规则
1.如果auto
声明的变量是按值初始化,则推导出的类型会忽略cv限定符;
2.使用auto
声明变量初始化时,目标对象如果是引用,则引用属性会被忽略;
3.使用auto
和万能引用声明变量时(见第6章),对于左值会将auto
推导为引用类型;
4.使用auto
声明变量,如果目标对象是一个数组或者函数,则auto
会被推导为对应的指针类型;
5.当auto关键字与列表初始化组合时,这里的规则有新老两个版本,这里只介绍新规则(C++17标准)。
(1)直接使用列表初始化,列表中必须为单元素,否则无法编译,auto
类型被推导为单元素的类型。
(2)用等号加列表初始化,列表中可以包含单个或者多个元素,auto
类型被推导为std::initializer_list
,其中T
是元素类型。请注意,在列表中包含多个元素的时候,元素的类型必须相同,否则编译器会报错
3.3 什么时候使用auto
简单归纳auto的使用规则。
1.当一眼就能看出声明变量的初始化类型的时候可以使用auto
。
2.对于复杂的类型,例如lambda表达式、std::bind等直接使用auto
。
3.4 返回类型推导【C++14】
C++14标准支持对返回类型声明为auto
的推导,例如:
auto l = [](auto a1, auto a2) { return a1 + a2; };
3.5 lambda表达式中使用auto类型推导
在C++14标准中我们还可以把auto写到lambda表达式的形参中,这样就得到了一个泛型的lambda表达式
起初在后置返回类型中使用auto是不允许的,但是后来人们发现,这是唯一让lambda表达式通过推导返回引用类型的方法了
传入参数类型(auto& i
),后置返回类型(-> auto&
),接收结果的变量(auto& j
)必须都是&,才能正确的返回引用。
auto lamda1 = [](auto& i) -> auto& { return i;};
auto& j = lamda1(s);
3.6 非类型模板形参占位符【C++17】
C++17标准对auto关键字又一次进行了扩展,使它可以作为非类型模板形参的占位符。
template<auto N>
void f()
{
qDebug() << N;
}
int main()
{
f<5>();
f<'c'>();
f<5.6>(); // 书上说编译错误 但是在Qt6.7 + MSVC2019 + C++17下通过了编译
}
3.7 结构化绑定【C++17】
对结构体的结构化绑定(structured bindings),这是C++17标准中引入的特性。
将对象的成员绑定到变量上,从而可以更方便地访问这些成员。
struct A {
int a;
double b;
};
int main() {
auto a = A{ .a = 1, .b = 2.0 };
auto [x, y] = a;
qDebug() << x << " " << y; // 输出: 1 2
return 0;
}
标签:11,17,推导,auto,C++,类型,lambda
From: https://www.cnblogs.com/Danieeel959/p/18391949