推荐点击左下角查看原文阅读
1.未初始化intmain(){inti=i*0;}
i未经初始化使用
2.额外的拷贝templatetypenameK,typenameVvoidprint(conststd::mapK,Vm){for(conststd::pairK,Vp:m){-------------------此处有问题//printp}}
map中以pairconstK,V形式,所以需要将pairconstK,V=constpairK,V进行类型转换,需要拷贝构造一个临时pair,K,V
所以最好让编译器来确定最优的类型,如下;
templatetypenameK,typenameVvoidprint(conststd::mapK,Vm){for(constautop:m)等同for(conststd::pairconstK,Vp:m){/*…*/}}
或者使用更好的方式结构化绑定
templatetypenameK,typenameVvoidprint(conststd::mapK,Vm){for(constauto[key,val]:m){/*…*/}}
c++-HowmuchistoomuchwithC++11autokeyword?-StackOverflow
GoogleC++StyleGuide
3.通用否?voidprintPair(constautop){std::coutp.first","p.second;}
垃圾的设计
语言的问题:
数据成员应该是私有的,它违背了这个规则
不通用,如果有第三个量怎么办,就不适用于std::tuple
voidprintPair(constautop){std::coutstd::get0(p);}
可以使用concept对其进行约束,这样只要是一对的数据结构pair和两个对象的tuple就都可以作为参数传入
templateclassPconceptPair=requires(Pp){requiresstd::tuple_sizeP::value==2;std::get0(p);std::get1(p);};voidprint(constPairautop){std::coutstd::get0(p)","std::get1(p);}intmain(intargc,char*argv[]){std::tupleint,inta{1,2};//满足std::pairint,intb{1,2};//满足std::tupleint,int,intc{1,2,3};//不满足}4.考虑specialization
这是一段零初始化容器中的所有对象的代码
voidzero_initialize_all(autocontainer){for(autoval:container)-----------------{val={};}}
其中第二个auto需要被换成auto(universalreference)
因为需要适应一个专门化的容器vectorbool
vectorbool不像其他容器一样按Byte存储的,它是按bit存储的,也就是说一个正常的bool类型的空间可以存放vectorbool中的8个,空间上确实优化了很多,然鹅,c++是不能直接取对bit操作的,对其使用operator[]其实返回的不是bool的引用而是一个”proxyreference"是”std::vectorbool:reference”类型的对象。
建议不要使用这个东西,坑人
专门化specializationstructPet{};structDog:publicPet{};templateclassTstructFoo{ staticvoidprint() { std::cout"Something"; }};templatestructFooPet{ staticvoidprint() { std::cout"Pet"; }};intmain(){ FooDog::print();--会输出什么呢?Something}
专门化会准确地匹配字符,继承也是不行的,改成指针也不行
5.悬挂引用templateclassMap,typenameKeyconsttypenameMap::mapped_typeget_or_default( constMapmap, constKeykey, consttypenameMap::mapped_typedefaultVal){ autopos=map.find(key); return(pos!=map.end()?pos-second:defaultVal);}intmain(){ mapMyString,MyStringmap; autoip=get_or_default(map,"localhost",".0.0.1"); std::cout"----------------------------------------------------------"std::endl; std::coutipstd::endl;//什么也没有}
因为返回值为consttypenameMap::mapped_type,所以get_or_default会产生引用的引用,到下一行销毁,所以就什么一找不到了
解决办法:
值返回
templateclassMap,typenameKeytypenameMap::mapped_type--------------------------------get_or_default(constMapmap,constKeykey,consttypenameMap::mapped_typedefaultVal)6.for循环临时对象
for(charc:Person{"John"}.name()){//dosomethingwithc}
原理:
如果.name返回引用,就会导致悬挂引用问题
auto_range=Person{"John"}.name();auto_begin=std::begin(_range);auto_end=std::end(_range);for(;_begin!=_end;++_begin){charc=*_begin;}
参考深入解析20个C++典型输入错误--IncrediClub,还有其他的一些错误类型,有的过于简单,有的我一了解,综上,只有上面这些
未平