c++日常(212)

for循环写法

1
2
for (int i : {0,1,2})
{ }

常数级的循环只能这样写了,感觉还好吧。

1
2
int p[5];
for each(int i in p)

这个常数级的循环真心没法优雅,留着以后再试试吧。

指针数组

1
2
3
4
5
int pa = 4;
int *p[3] = {0};
p[0] = &pa;
int **pp[4] = {0};
pp[0] = &p[0];

这是数组,不是指针

RVO和NRVO

Return Value Optimization 返回值优化
Named Return Value Optimization 命名返回值优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class BigObject
{
};
BigObject foo()
{
return BigObject(); // RVO
//以前看effective的时候讲了这里要产生临时变量
//然后再执行拷贝函数
//现在编译器智能了,它会优化这一段,自动去掉临时变量,只会走一次构造函数
//即 BigObject tt = fOO(); 这个过程只会调用一次构造函数(vs2015 release debug都只走一次)
}
BigObject bar()
{
BigObject localObj;
return localObj; // NRVO
//同上,以前的技术只支持匿名变量的优化,现在高档了,支持实名变量的优化
//即 BigObject tt = bar(); vs2015 release 下只走一次构造函数,debug下 走一次构造函数,走一次拷贝函数
}

变长参数传递

一开始我想用va_list,但是感觉一点都不酷就google了下.
让我惊讶的是vs15支持三点运算符(和js不同,它的符号放后面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename T, typename... arg>
void funa(T t, arg... ars)
{
fuu(ars...);
}
void fuu(int t, ...)//牛逼,自动解构,这里
{
va_list list;
va_start(list, t);
int arg = va_arg(list, int);//这里是3 funa抢一个, t抢一个
va_end(list);
}
funa(1, 2, ,3 , "afdf");

c++11 decltype

动态类型:

1
2
3
int ci = 3, &cj=ci;
decltype(ci) d;//这是个int
decltype(cj) f = d;//这是个int&,必须初始化

他的动态类型已经可以和auto媲美了。但有点意思的是它对括号敏感

1
2
3
int a = 2, f = 3;
decltype((a)) b = f; //b是int&类型
decltype(((a))) d = f;//d也是int&类型

decltype(func())并不会执行func函数,只是要它返回类型推导

// //