所在的位置: C++ >> C++发展 >> C典型错误

C典型错误

网络推广求职招聘交流群 http://www.prcgoogle.com/zonghe/guonei/2021/0913/6012.html

推荐点击左下角查看原文阅读

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”类型的对象。

建议不要使用这个东西,坑人

专门化specialization

structPet{};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,还有其他的一些错误类型,有的过于简单,有的我一了解,综上,只有上面这些

未平




转载请注明:http://www.aierlanlan.com/tzrz/499.html