smart_ptr.html 334 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.8">
  8. <meta name="author" content="Greg Colvin, Beman Dawes, Peter Dimov, Glen Fernandes">
  9. <title>Boost.SmartPtr: The Smart Pointer Library</title>
  10. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
  11. <style>
  12. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  13. /* Uncomment @import statement below to use as custom stylesheet */
  14. /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
  15. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  16. audio,canvas,video{display:inline-block}
  17. audio:not([controls]){display:none;height:0}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. a{background:transparent}
  21. a:focus{outline:thin dotted}
  22. a:active,a:hover{outline:0}
  23. h1{font-size:2em;margin:.67em 0}
  24. abbr[title]{border-bottom:1px dotted}
  25. b,strong{font-weight:bold}
  26. dfn{font-style:italic}
  27. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  28. mark{background:#ff0;color:#000}
  29. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  30. pre{white-space:pre-wrap}
  31. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  32. small{font-size:80%}
  33. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  34. sup{top:-.5em}
  35. sub{bottom:-.25em}
  36. img{border:0}
  37. svg:not(:root){overflow:hidden}
  38. figure{margin:0}
  39. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  40. legend{border:0;padding:0}
  41. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  42. button,input{line-height:normal}
  43. button,select{text-transform:none}
  44. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  45. button[disabled],html input[disabled]{cursor:default}
  46. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  47. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  48. textarea{overflow:auto;vertical-align:top}
  49. table{border-collapse:collapse;border-spacing:0}
  50. *,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  51. html,body{font-size:100%}
  52. body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
  53. a:hover{cursor:pointer}
  54. img,object,embed{max-width:100%;height:auto}
  55. object,embed{height:100%}
  56. img{-ms-interpolation-mode:bicubic}
  57. .left{float:left!important}
  58. .right{float:right!important}
  59. .text-left{text-align:left!important}
  60. .text-right{text-align:right!important}
  61. .text-center{text-align:center!important}
  62. .text-justify{text-align:justify!important}
  63. .hide{display:none}
  64. img,object,svg{display:inline-block;vertical-align:middle}
  65. textarea{height:auto;min-height:50px}
  66. select{width:100%}
  67. .center{margin-left:auto;margin-right:auto}
  68. .stretch{width:100%}
  69. .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
  70. div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
  71. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  72. a:hover,a:focus{color:#1d4b8f}
  73. a img{border:none}
  74. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  75. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  76. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
  77. h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
  78. h1{font-size:2.125em}
  79. h2{font-size:1.6875em}
  80. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  81. h4,h5{font-size:1.125em}
  82. h6{font-size:1em}
  83. hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  84. em,i{font-style:italic;line-height:inherit}
  85. strong,b{font-weight:bold;line-height:inherit}
  86. small{font-size:60%;line-height:inherit}
  87. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  88. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  89. ul,ol{margin-left:1.5em}
  90. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  91. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  92. ul.square{list-style-type:square}
  93. ul.circle{list-style-type:circle}
  94. ul.disc{list-style-type:disc}
  95. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  96. dl dt{margin-bottom:.3125em;font-weight:bold}
  97. dl dd{margin-bottom:1.25em}
  98. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  99. abbr{text-transform:none}
  100. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  101. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  102. blockquote cite::before{content:"\2014 \0020"}
  103. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  104. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  105. @media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  106. h1{font-size:2.75em}
  107. h2{font-size:2.3125em}
  108. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  109. h4{font-size:1.4375em}}
  110. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  111. table thead,table tfoot{background:#f7f8f7}
  112. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  113. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  114. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  115. table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
  116. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  117. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  118. .clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
  119. .clearfix::after,.float-group::after{clear:both}
  120. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
  121. *:not(pre)>code.nobreak{word-wrap:normal}
  122. *:not(pre)>code.nowrap{white-space:nowrap}
  123. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  124. em em{font-style:normal}
  125. strong strong{font-weight:400}
  126. .keyseq{color:rgba(51,51,51,.8)}
  127. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  128. .keyseq kbd:first-child{margin-left:0}
  129. .keyseq kbd:last-child{margin-right:0}
  130. .menuseq,.menuref{color:#000}
  131. .menuseq b:not(.caret),.menuref{font-weight:inherit}
  132. .menuseq{word-spacing:-.02em}
  133. .menuseq b.caret{font-size:1.25em;line-height:.8}
  134. .menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
  135. b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
  136. b.button::before{content:"[";padding:0 3px 0 2px}
  137. b.button::after{content:"]";padding:0 2px 0 3px}
  138. p a>code:hover{color:rgba(0,0,0,.9)}
  139. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  140. #header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
  141. #header::after,#content::after,#footnotes::after,#footer::after{clear:both}
  142. #content{margin-top:1.25em}
  143. #content::before{content:none}
  144. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  145. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
  146. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
  147. #header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
  148. #header .details span:first-child{margin-left:-.125em}
  149. #header .details span.email a{color:rgba(0,0,0,.85)}
  150. #header .details br{display:none}
  151. #header .details br+span::before{content:"\00a0\2013\00a0"}
  152. #header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  153. #header .details br+span#revremark::before{content:"\00a0|\00a0"}
  154. #header #revnumber{text-transform:capitalize}
  155. #header #revnumber::after{content:"\00a0"}
  156. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  157. #toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
  158. #toc>ul{margin-left:.125em}
  159. #toc ul.sectlevel0>li>a{font-style:italic}
  160. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  161. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  162. #toc li{line-height:1.3334;margin-top:.3334em}
  163. #toc a{text-decoration:none}
  164. #toc a:active{text-decoration:underline}
  165. #toctitle{color:#7a2518;font-size:1.2em}
  166. @media screen and (min-width:768px){#toctitle{font-size:1.375em}
  167. body.toc2{padding-left:15em;padding-right:0}
  168. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  169. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  170. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  171. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  172. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  173. body.toc2.toc-right{padding-left:0;padding-right:15em}
  174. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
  175. @media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  176. #toc.toc2{width:20em}
  177. #toc.toc2 #toctitle{font-size:1.375em}
  178. #toc.toc2>ul{font-size:.95em}
  179. #toc.toc2 ul ul{padding-left:1.25em}
  180. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  181. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  182. #content #toc>:first-child{margin-top:0}
  183. #content #toc>:last-child{margin-bottom:0}
  184. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  185. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  186. #content{margin-bottom:.625em}
  187. .sect1{padding-bottom:.625em}
  188. @media screen and (min-width:768px){#content{margin-bottom:1.25em}
  189. .sect1{padding-bottom:1.25em}}
  190. .sect1:last-child{padding-bottom:0}
  191. .sect1+.sect1{border-top:1px solid #e7e7e9}
  192. #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  193. #content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
  194. #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
  195. #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
  196. #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
  197. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  198. .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
  199. table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
  200. .paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
  201. table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
  202. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  203. .admonitionblock>table td.icon{text-align:center;width:80px}
  204. .admonitionblock>table td.icon img{max-width:none}
  205. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  206. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
  207. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  208. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  209. .exampleblock>.content>:first-child{margin-top:0}
  210. .exampleblock>.content>:last-child{margin-bottom:0}
  211. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  212. .sidebarblock>:first-child{margin-top:0}
  213. .sidebarblock>:last-child{margin-bottom:0}
  214. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  215. .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
  216. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  217. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  218. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
  219. @media screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  220. @media screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  221. .literalblock pre.nowrap,.literalblock pre.nowrap pre,.listingblock pre.nowrap,.listingblock pre.nowrap pre{white-space:pre;word-wrap:normal}
  222. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  223. .listingblock pre.highlightjs{padding:0}
  224. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  225. .listingblock pre.prettyprint{border-width:0}
  226. .listingblock>.content{position:relative}
  227. .listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  228. .listingblock:hover code[data-lang]::before{display:block}
  229. .listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:#999}
  230. .listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
  231. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  232. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  233. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  234. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #dddddf}
  235. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  236. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  237. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  238. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  239. .quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  240. .quoteblock blockquote{margin:0;padding:0;border:0}
  241. .quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  242. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  243. .quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
  244. .verseblock{margin:0 1em 1.25em}
  245. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  246. .verseblock pre strong{font-weight:400}
  247. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  248. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  249. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  250. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  251. .quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
  252. .quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
  253. .quoteblock.abstract{margin:0 1em 1.25em;display:block}
  254. .quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
  255. .quoteblock.excerpt,.quoteblock .quoteblock{margin:0 0 1.25em;padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
  256. .quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
  257. .quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
  258. table.tableblock{max-width:100%;border-collapse:separate}
  259. p.tableblock:last-child{margin-bottom:0}
  260. td.tableblock>.content{margin-bottom:-1.25em}
  261. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  262. table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
  263. table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
  264. table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
  265. table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
  266. table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
  267. table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
  268. table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
  269. table.frame-all{border-width:1px}
  270. table.frame-sides{border-width:0 1px}
  271. table.frame-topbot,table.frame-ends{border-width:1px 0}
  272. table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd){background:#f8f8f7}
  273. table.stripes-none tr,table.stripes-odd tr:nth-of-type(even){background:none}
  274. th.halign-left,td.halign-left{text-align:left}
  275. th.halign-right,td.halign-right{text-align:right}
  276. th.halign-center,td.halign-center{text-align:center}
  277. th.valign-top,td.valign-top{vertical-align:top}
  278. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  279. th.valign-middle,td.valign-middle{vertical-align:middle}
  280. table thead th,table tfoot th{font-weight:bold}
  281. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  282. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  283. p.tableblock>code:only-child{background:none;padding:0}
  284. p.tableblock{font-size:1em}
  285. td>div.verse{white-space:pre}
  286. ol{margin-left:1.75em}
  287. ul li ol{margin-left:1.5em}
  288. dl dd{margin-left:1.125em}
  289. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  290. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  291. ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
  292. ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
  293. ul.unstyled,ol.unstyled{margin-left:0}
  294. ul.checklist{margin-left:.625em}
  295. ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
  296. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
  297. ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
  298. ul.inline>li{margin-left:1.25em}
  299. .unstyled dl dt{font-weight:400;font-style:normal}
  300. ol.arabic{list-style-type:decimal}
  301. ol.decimal{list-style-type:decimal-leading-zero}
  302. ol.loweralpha{list-style-type:lower-alpha}
  303. ol.upperalpha{list-style-type:upper-alpha}
  304. ol.lowerroman{list-style-type:lower-roman}
  305. ol.upperroman{list-style-type:upper-roman}
  306. ol.lowergreek{list-style-type:lower-greek}
  307. .hdlist>table,.colist>table{border:0;background:none}
  308. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  309. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  310. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  311. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  312. .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
  313. .colist td:not([class]):first-child img{max-width:none}
  314. .colist td:not([class]):last-child{padding:.25em 0}
  315. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  316. .imageblock.left{margin:.25em .625em 1.25em 0}
  317. .imageblock.right{margin:.25em 0 1.25em .625em}
  318. .imageblock>.title{margin-bottom:0}
  319. .imageblock.thumb,.imageblock.th{border-width:6px}
  320. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  321. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  322. .image.left{margin-right:.625em}
  323. .image.right{margin-left:.625em}
  324. a.image{text-decoration:none;display:inline-block}
  325. a.image object{pointer-events:none}
  326. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  327. sup.footnote a,sup.footnoteref a{text-decoration:none}
  328. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  329. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  330. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
  331. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
  332. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
  333. #footnotes .footnote:last-of-type{margin-bottom:0}
  334. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  335. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  336. .gist .file-data>table td.line-data{width:99%}
  337. div.unbreakable{page-break-inside:avoid}
  338. .big{font-size:larger}
  339. .small{font-size:smaller}
  340. .underline{text-decoration:underline}
  341. .overline{text-decoration:overline}
  342. .line-through{text-decoration:line-through}
  343. .aqua{color:#00bfbf}
  344. .aqua-background{background-color:#00fafa}
  345. .black{color:#000}
  346. .black-background{background-color:#000}
  347. .blue{color:#0000bf}
  348. .blue-background{background-color:#0000fa}
  349. .fuchsia{color:#bf00bf}
  350. .fuchsia-background{background-color:#fa00fa}
  351. .gray{color:#606060}
  352. .gray-background{background-color:#7d7d7d}
  353. .green{color:#006000}
  354. .green-background{background-color:#007d00}
  355. .lime{color:#00bf00}
  356. .lime-background{background-color:#00fa00}
  357. .maroon{color:#600000}
  358. .maroon-background{background-color:#7d0000}
  359. .navy{color:#000060}
  360. .navy-background{background-color:#00007d}
  361. .olive{color:#606000}
  362. .olive-background{background-color:#7d7d00}
  363. .purple{color:#600060}
  364. .purple-background{background-color:#7d007d}
  365. .red{color:#bf0000}
  366. .red-background{background-color:#fa0000}
  367. .silver{color:#909090}
  368. .silver-background{background-color:#bcbcbc}
  369. .teal{color:#006060}
  370. .teal-background{background-color:#007d7d}
  371. .white{color:#bfbfbf}
  372. .white-background{background-color:#fafafa}
  373. .yellow{color:#bfbf00}
  374. .yellow-background{background-color:#fafa00}
  375. span.icon>.fa{cursor:default}
  376. a span.icon>.fa{cursor:inherit}
  377. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  378. .admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
  379. .admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  380. .admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
  381. .admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
  382. .admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
  383. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  384. .conum[data-value] *{color:#fff!important}
  385. .conum[data-value]+b{display:none}
  386. .conum[data-value]::after{content:attr(data-value)}
  387. pre .conum[data-value]{position:relative;top:-.125em}
  388. b.conum *{color:inherit!important}
  389. .conum:not([data-value]):empty{display:none}
  390. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  391. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  392. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  393. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  394. p{margin-bottom:1.25rem}
  395. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  396. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  397. .print-only{display:none!important}
  398. @page{margin:1.25cm .75cm}
  399. @media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  400. html{font-size:80%}
  401. a{color:inherit!important;text-decoration:underline!important}
  402. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  403. a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  404. abbr[title]::after{content:" (" attr(title) ")"}
  405. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  406. thead{display:table-header-group}
  407. svg{max-width:100%}
  408. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  409. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  410. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  411. #toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
  412. body.book #header{text-align:center}
  413. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
  414. body.book #header .details{border:0!important;display:block;padding:0!important}
  415. body.book #header .details span:first-child{margin-left:0!important}
  416. body.book #header .details br{display:block}
  417. body.book #header .details br+span::before{content:none!important}
  418. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  419. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  420. .listingblock code[data-lang]::before{display:block}
  421. #footer{padding:0 .9375em}
  422. .hide-on-print{display:none!important}
  423. .print-only{display:block!important}
  424. .hide-for-print{display:none!important}
  425. .show-for-print{display:inherit!important}}
  426. @media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
  427. .sect1{padding:0!important}
  428. .sect1+.sect1{border:0}
  429. #footer{background:none}
  430. #footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
  431. @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
  432. </style>
  433. </head>
  434. <body class="article toc2 toc-left">
  435. <div id="header">
  436. <h1>Boost.SmartPtr: The Smart Pointer Library</h1>
  437. <div class="details">
  438. <span id="author" class="author">Greg Colvin, Beman Dawes, Peter Dimov, Glen Fernandes</span><br>
  439. </div>
  440. <div id="toc" class="toc2">
  441. <div id="toctitle">Table of Contents</div>
  442. <ul class="sectlevel1">
  443. <li><a href="#introduction">Introduction</a></li>
  444. <li><a href="#changelog">Revision History</a>
  445. <ul class="sectlevel2">
  446. <li><a href="#changelog_changes_in_1_72_0">Changes in 1.72.0</a></li>
  447. <li><a href="#changelog_changes_in_1_71_0">Changes in 1.71.0</a></li>
  448. <li><a href="#changelog_changes_in_1_65_0">Changes in 1.65.0</a></li>
  449. </ul>
  450. </li>
  451. <li><a href="#scoped_ptr">scoped_ptr: Scoped Object Ownership</a>
  452. <ul class="sectlevel2">
  453. <li><a href="#scoped_ptr_description">Description</a></li>
  454. <li><a href="#scoped_ptr_synopsis">Synopsis</a></li>
  455. <li><a href="#scoped_ptr_members">Members</a></li>
  456. <li><a href="#scoped_ptr_free_functions">Free Functions</a></li>
  457. <li><a href="#scoped_ptr_example">Example</a></li>
  458. <li><a href="#scoped_ptr_rationale">Rationale</a></li>
  459. <li><a href="#scoped_ptr_handlebody_idiom">Handle/Body Idiom</a></li>
  460. <li><a href="#scoped_ptr_frequently_asked_questions">Frequently Asked Questions</a></li>
  461. </ul>
  462. </li>
  463. <li><a href="#scoped_array">scoped_array: Scoped Array Ownership</a>
  464. <ul class="sectlevel2">
  465. <li><a href="#scoped_array_description">Description</a></li>
  466. <li><a href="#scoped_array_synopsis">Synopsis</a></li>
  467. <li><a href="#scoped_array_members">Members</a></li>
  468. <li><a href="#scoped_array_free_functions">Free Functions</a></li>
  469. </ul>
  470. </li>
  471. <li><a href="#shared_ptr">shared_ptr: Shared Ownership</a>
  472. <ul class="sectlevel2">
  473. <li><a href="#shared_ptr_description">Description</a></li>
  474. <li><a href="#shared_ptr_best_practices">Best Practices</a></li>
  475. <li><a href="#shared_ptr_synopsis">Synopsis</a></li>
  476. <li><a href="#shared_ptr_members">Members</a></li>
  477. <li><a href="#shared_ptr_free_functions">Free Functions</a></li>
  478. <li><a href="#shared_ptr_example">Example</a></li>
  479. <li><a href="#shared_ptr_handlebody_idiom">Handle/Body Idiom</a></li>
  480. <li><a href="#shared_ptr_thread_safety">Thread Safety</a></li>
  481. <li><a href="#shared_ptr_frequently_asked_questions">Frequently Asked Questions</a></li>
  482. </ul>
  483. </li>
  484. <li><a href="#weak_ptr">weak_ptr: Non-owning Observer</a>
  485. <ul class="sectlevel2">
  486. <li><a href="#weak_ptr_description">Description</a></li>
  487. <li><a href="#weak_ptr_synopsis">Synopsis</a></li>
  488. <li><a href="#weak_ptr_members">Members</a></li>
  489. <li><a href="#weak_ptr_free_functions">Free Functions</a></li>
  490. <li><a href="#weak_ptr_frequently_asked_questions">Frequently Asked Questions</a></li>
  491. </ul>
  492. </li>
  493. <li><a href="#make_shared">make_shared: Creating shared_ptr</a>
  494. <ul class="sectlevel2">
  495. <li><a href="#make_shared_description">Description</a></li>
  496. <li><a href="#make_shared_rationale">Rationale</a></li>
  497. <li><a href="#make_shared_synopsis">Synopsis</a></li>
  498. <li><a href="#make_shared_common_requirements">Common Requirements</a></li>
  499. <li><a href="#make_shared_free_functions">Free Functions</a></li>
  500. </ul>
  501. </li>
  502. <li><a href="#enable_shared_from_this">enable_shared_from_this</a>
  503. <ul class="sectlevel2">
  504. <li><a href="#enable_shared_from_this_description">Description</a></li>
  505. <li><a href="#enable_shared_from_this_example">Example</a></li>
  506. <li><a href="#enable_shared_from_this_synopsis">Synopsis</a></li>
  507. <li><a href="#enable_shared_from_this_members">Members</a></li>
  508. </ul>
  509. </li>
  510. <li><a href="#enable_shared_from">enable_shared_from</a>
  511. <ul class="sectlevel2">
  512. <li><a href="#enable_shared_from_description">Description</a></li>
  513. <li><a href="#enable_shared_from_example">Example</a></li>
  514. <li><a href="#enable_shared_from_synopsis">Synopsis</a></li>
  515. <li><a href="#enable_shared_from_functions">Functions</a></li>
  516. </ul>
  517. </li>
  518. <li><a href="#make_unique">make_unique: Creating unique_ptr</a>
  519. <ul class="sectlevel2">
  520. <li><a href="#make_unique_description">Description</a></li>
  521. <li><a href="#make_unique_rationale">Rationale</a></li>
  522. <li><a href="#make_unique_synopsis">Synopsis</a></li>
  523. <li><a href="#make_unique_free_functions">Free Functions</a></li>
  524. </ul>
  525. </li>
  526. <li><a href="#allocate_unique">allocate_unique: Creating unique_ptr</a>
  527. <ul class="sectlevel2">
  528. <li><a href="#allocate_unique_description">Description</a></li>
  529. <li><a href="#allocate_unique_rationale">Rationale</a></li>
  530. <li><a href="#allocate_unique_synopsis">Synopsis</a></li>
  531. <li><a href="#allocate_unique_common_requirements">Common Requirements</a></li>
  532. <li><a href="#allocate_unique_free_functions">Free Functions</a></li>
  533. <li><a href="#allocate_unique_deleter">Deleter</a></li>
  534. </ul>
  535. </li>
  536. <li><a href="#intrusive_ptr">intrusive_ptr: Managing Objects with Embedded Counts</a>
  537. <ul class="sectlevel2">
  538. <li><a href="#intrusive_ptr_description">Description</a></li>
  539. <li><a href="#intrusive_ptr_synopsis">Synopsis</a></li>
  540. <li><a href="#intrusive_ptr_members">Members</a></li>
  541. <li><a href="#intrusive_ptr_free_functions">Free Functions</a></li>
  542. </ul>
  543. </li>
  544. <li><a href="#intrusive_ref_counter">intrusive_ref_counter</a>
  545. <ul class="sectlevel2">
  546. <li><a href="#intrusive_ref_counter_description">Description</a></li>
  547. <li><a href="#intrusive_ref_counter_synopsis">Synopsis</a></li>
  548. <li><a href="#intrusive_ref_counter_members">Members</a></li>
  549. <li><a href="#intrusive_ref_counter_free_functions">Free Functions</a></li>
  550. </ul>
  551. </li>
  552. <li><a href="#local_shared_ptr">local_shared_ptr: Shared Ownership within a Single Thread</a>
  553. <ul class="sectlevel2">
  554. <li><a href="#local_shared_ptr_description">Description</a></li>
  555. <li><a href="#local_shared_ptr_synopsis">Synopsis</a></li>
  556. <li><a href="#local_shared_ptr_members">Members</a></li>
  557. <li><a href="#local_shared_ptr_free_functions">Free Functions</a></li>
  558. </ul>
  559. </li>
  560. <li><a href="#make_local_shared">make_local_shared: Creating local_shared_ptr</a>
  561. <ul class="sectlevel2">
  562. <li><a href="#make_local_shared_description">Description</a></li>
  563. <li><a href="#make_local_shared_synopsis">Synopsis</a></li>
  564. <li><a href="#make_local_shared_description_2">Description</a></li>
  565. </ul>
  566. </li>
  567. <li><a href="#pointer_cast">Generic Pointer Casts</a>
  568. <ul class="sectlevel2">
  569. <li><a href="#pointer_cast_description">Description</a></li>
  570. <li><a href="#pointer_cast_rationale">Rationale</a></li>
  571. <li><a href="#pointer_cast_synopsis">Synopsis</a></li>
  572. <li><a href="#pointer_cast_free_functions">Free Functions</a></li>
  573. <li><a href="#pointer_cast_example">Example</a></li>
  574. </ul>
  575. </li>
  576. <li><a href="#pointer_to_other">pointer_to_other</a>
  577. <ul class="sectlevel2">
  578. <li><a href="#pointer_to_other_description">Description</a></li>
  579. <li><a href="#pointer_to_other_rationale">Rationale</a></li>
  580. <li><a href="#pointer_to_other_synopsis">Synopsis</a></li>
  581. <li><a href="#pointer_to_other_example">Example</a></li>
  582. </ul>
  583. </li>
  584. <li><a href="#atomic_shared_ptr">atomic_shared_ptr</a>
  585. <ul class="sectlevel2">
  586. <li><a href="#atomic_shared_ptr_description">Description</a></li>
  587. <li><a href="#atomic_shared_ptr_synopsis">Synopsis</a></li>
  588. <li><a href="#atomic_shared_ptr_members">Members</a></li>
  589. </ul>
  590. </li>
  591. <li><a href="#techniques">Appendix A: Smart Pointer Programming Techniques</a>
  592. <ul class="sectlevel2">
  593. <li><a href="#techniques_incomplete">Using incomplete classes for implementation hiding</a></li>
  594. <li><a href="#techniques_the_pimpl_idiom">The "Pimpl" idiom</a></li>
  595. <li><a href="#techniques_using_abstract_classes_for_implementation_hiding">Using abstract classes for implementation hiding</a></li>
  596. <li><a href="#techniques_preventing_delete_px_get">Preventing <code>delete px.get()</code></a></li>
  597. <li><a href="#techniques_encapsulating_allocation_details_wrapping_factory_functions">Encapsulating allocation details, wrapping factory functions</a></li>
  598. <li><a href="#techniques_static">Using a shared_ptr to hold a pointer to a statically allocated object</a></li>
  599. <li><a href="#techniques_using_a_shared_ptr_to_hold_a_pointer_to_a_com_object">Using a shared_ptr to hold a pointer to a COM Object</a></li>
  600. <li><a href="#techniques_intrusive">Using a shared_ptr to hold a pointer to an object with an embedded reference count</a></li>
  601. <li><a href="#techniques_using_a_shared_ptr_to_hold_another_shared_ownership_smart_pointer">Using a shared_ptr to hold another shared ownership smart pointer</a></li>
  602. <li><a href="#techniques_from_raw">Obtaining a shared_ptr from a raw pointer</a></li>
  603. <li><a href="#techniques_obtaining_a_shared_ptr_weak_ptr_to_this_in_a_constructor">Obtaining a shared_ptr (weak_ptr) to this in a constructor</a></li>
  604. <li><a href="#techniques_obtaining_a_shared_ptr_to_this">Obtaining a shared_ptr to this</a></li>
  605. <li><a href="#techniques_using_shared_ptr_as_a_smart_counted_handle">Using shared_ptr as a smart counted handle</a></li>
  606. <li><a href="#techniques_using_shared_ptr_to_execute_code_on_block_exit">Using shared_ptr to execute code on block exit</a></li>
  607. <li><a href="#techniques_using_shared_ptrvoid_to_hold_an_arbitrary_object">Using shared_ptr&lt;void&gt; to hold an arbitrary object</a></li>
  608. <li><a href="#techniques_associating_arbitrary_data_with_heterogeneous_shared_ptr_instances">Associating arbitrary data with heterogeneous <code>shared_ptr</code> instances</a></li>
  609. <li><a href="#techniques_using_shared_ptr_as_a_copyconstructible_mutex_lock">Using <code>shared_ptr</code> as a <code>CopyConstructible</code> mutex lock</a></li>
  610. <li><a href="#techniques_using_shared_ptr_to_wrap_member_function_calls">Using shared_ptr to wrap member function calls</a></li>
  611. <li><a href="#techniques_delayed_deallocation">Delayed deallocation</a></li>
  612. <li><a href="#techniques_weak_without_shared">Weak pointers to objects not managed by a shared_ptr</a></li>
  613. </ul>
  614. </li>
  615. <li><a href="#history">Appendix B: History and Acknowledgments</a>
  616. <ul class="sectlevel2">
  617. <li><a href="#history_summer_1994">Summer 1994</a></li>
  618. <li><a href="#history_october_1998">October 1998</a></li>
  619. <li><a href="#history_may_1999">May 1999</a></li>
  620. <li><a href="#history_september_1999">September 1999</a></li>
  621. <li><a href="#history_november_1999">November 1999</a></li>
  622. <li><a href="#history_may_2001">May 2001</a></li>
  623. <li><a href="#history_january_2002">January 2002</a></li>
  624. <li><a href="#history_march_2003">March 2003</a></li>
  625. <li><a href="#history_july_2007">July 2007</a></li>
  626. <li><a href="#history_november_2012">November 2012</a></li>
  627. <li><a href="#history_april_2013">April 2013</a></li>
  628. <li><a href="#history_february_2014">February 2014</a></li>
  629. <li><a href="#history_february_2017">February 2017</a></li>
  630. <li><a href="#history_june_2017">June 2017</a></li>
  631. <li><a href="#history_august_2019">August 2019</a></li>
  632. </ul>
  633. </li>
  634. <li><a href="#shared_array">Appendix C: shared_array (deprecated)</a>
  635. <ul class="sectlevel2">
  636. <li><a href="#shared_array_description">Description</a></li>
  637. <li><a href="#shared_array_synopsis">Synopsis</a></li>
  638. <li><a href="#shared_array_members">Members</a></li>
  639. <li><a href="#shared_array_free_functions">Free Functions</a></li>
  640. </ul>
  641. </li>
  642. <li><a href="#copyright">Appendix D: Copyright and License</a></li>
  643. </ul>
  644. </div>
  645. </div>
  646. <div id="content">
  647. <div class="sect1">
  648. <h2 id="introduction">Introduction</h2>
  649. <div class="sectionbody">
  650. <div class="paragraph">
  651. <p>Smart pointers are objects which store pointers to dynamically allocated (heap) objects.
  652. They behave much like built-in C&#43;&#43; pointers except that they automatically delete the object
  653. pointed to at the appropriate time. Smart pointers are particularly useful in the face of
  654. exceptions as they ensure proper destruction of dynamically allocated objects. They can also be
  655. used to keep track of dynamically allocated objects shared by multiple owners.</p>
  656. </div>
  657. <div class="paragraph">
  658. <p>Conceptually, smart pointers are seen as owning the object pointed to, and thus responsible for
  659. deletion of the object when it is no longer needed. As such, they are examples of the "resource
  660. acquisition is initialization" idiom described in Bjarne Stroustrup&#8217;s "The C++ Programming Language",
  661. 3rd edition, Section 14.4, Resource Management.</p>
  662. </div>
  663. <div class="paragraph">
  664. <p>This library provides six smart pointer class templates:</p>
  665. </div>
  666. <div class="ulist">
  667. <ul>
  668. <li>
  669. <p><code><a href="#scoped_ptr">scoped_ptr</a></code>, used to contain ownership of a dynamically allocated object to the current scope;</p>
  670. </li>
  671. <li>
  672. <p><code><a href="#scoped_array">scoped_array</a></code>, which provides scoped ownership for a dynamically allocated array;</p>
  673. </li>
  674. <li>
  675. <p><code><a href="#shared_ptr">shared_ptr</a></code>, a versatile tool for managing shared ownership of an object or array;</p>
  676. </li>
  677. <li>
  678. <p><code><a href="#weak_ptr">weak_ptr</a></code>, a non-owning observer to a shared_ptr-managed object that can be promoted temporarily to shared_ptr;</p>
  679. </li>
  680. <li>
  681. <p><code><a href="#intrusive_ptr">intrusive_ptr</a></code>, a pointer to objects with an embedded reference count;</p>
  682. </li>
  683. <li>
  684. <p><code><a href="#local_shared_ptr">local_shared_ptr</a></code>, providing shared ownership within a single thread.</p>
  685. </li>
  686. </ul>
  687. </div>
  688. <div class="paragraph">
  689. <p><code>shared_ptr</code> and <code>weak_ptr</code> are part of the C&#43;&#43; standard since its 2011 iteration.</p>
  690. </div>
  691. <div class="paragraph">
  692. <p>In addition, the library contains the following supporting utility functions and classes:</p>
  693. </div>
  694. <div class="ulist">
  695. <ul>
  696. <li>
  697. <p><code><a href="#make_shared">make_shared</a></code>, a factory function for creating objects that returns a <code>shared_ptr</code>;</p>
  698. </li>
  699. <li>
  700. <p><code><a href="#make_unique">make_unique</a></code>, a factory function returning <code>std::unique_ptr</code>;</p>
  701. </li>
  702. <li>
  703. <p><code><a href="#allocate_unique">allocate_unique</a></code>, a factory function for creating objects using an allocator that returns a <code>std::unique_ptr</code>;</p>
  704. </li>
  705. <li>
  706. <p><code><a href="#enable_shared_from_this">enable_shared_from_this</a></code>, a helper base class that enables the acquisition of a <code>shared_ptr</code> pointing to <code>this</code>;</p>
  707. </li>
  708. <li>
  709. <p><code><a href="#pointer_to_other">pointer_to_other</a></code>, a helper trait for converting one smart pointer type to another;</p>
  710. </li>
  711. <li>
  712. <p><code><a href="#pointer_cast">static_pointer_cast</a></code> and companions, generic smart pointer casts;</p>
  713. </li>
  714. <li>
  715. <p><code><a href="#intrusive_ref_counter">intrusive_ref_counter</a></code>, a helper base class containing a reference count.</p>
  716. </li>
  717. <li>
  718. <p><code><a href="#atomic_shared_ptr">atomic_shared_ptr</a></code>, a helper class implementing the interface of <code>std::atomic</code> for a value of type <code>shared_ptr</code>.</p>
  719. </li>
  720. </ul>
  721. </div>
  722. <div class="paragraph">
  723. <p>As a general rule, the destructor or <code>operator delete</code> for an object managed by pointers in the library
  724. are not allowed to throw exceptions.</p>
  725. </div>
  726. </div>
  727. </div>
  728. <div class="sect1">
  729. <h2 id="changelog">Revision History</h2>
  730. <div class="sectionbody">
  731. <div class="sect2">
  732. <h3 id="changelog_changes_in_1_72_0">Changes in 1.72.0</h3>
  733. <div class="ulist">
  734. <ul>
  735. <li>
  736. <p>Added <code>allocate_unique</code></p>
  737. </li>
  738. </ul>
  739. </div>
  740. </div>
  741. <div class="sect2">
  742. <h3 id="changelog_changes_in_1_71_0">Changes in 1.71.0</h3>
  743. <div class="ulist">
  744. <ul>
  745. <li>
  746. <p>Added aliasing constructors to <code>weak_ptr</code></p>
  747. </li>
  748. <li>
  749. <p>Added <code>weak_ptr&lt;T&gt;::empty()</code></p>
  750. </li>
  751. <li>
  752. <p>Added <code>enable_shared_from</code>, <code>shared_from</code>, and <code>weak_from</code></p>
  753. </li>
  754. </ul>
  755. </div>
  756. </div>
  757. <div class="sect2">
  758. <h3 id="changelog_changes_in_1_65_0">Changes in 1.65.0</h3>
  759. <div class="ulist">
  760. <ul>
  761. <li>
  762. <p>Added <code>atomic_shared_ptr</code></p>
  763. </li>
  764. <li>
  765. <p>Added <code>local_shared_ptr</code>, <code>make_local_shared</code></p>
  766. </li>
  767. </ul>
  768. </div>
  769. </div>
  770. </div>
  771. </div>
  772. <div class="sect1">
  773. <h2 id="scoped_ptr">scoped_ptr: Scoped Object Ownership</h2>
  774. <div class="sectionbody">
  775. <div class="sect2">
  776. <h3 id="scoped_ptr_description">Description</h3>
  777. <div class="paragraph">
  778. <p>The <code>scoped_ptr</code> class template stores a pointer to a dynamically allocated object.
  779. (Dynamically allocated objects are allocated with the C&#43;&#43; <code>new</code> expression.) The
  780. object pointed to is guaranteed to be deleted, either on destruction of the <code>scoped_ptr</code>,
  781. or via an explicit <code>reset</code>. See the <a href="#scoped_ptr_example">example</a>.</p>
  782. </div>
  783. <div class="paragraph">
  784. <p><code>scoped_ptr</code> is a simple solution for simple needs. It supplies a basic "resource acquisition
  785. is initialization" facility, without shared-ownership or transfer-of-ownership semantics.
  786. Both its name and enforcement of semantics (by being noncopyable) signal its intent to retain
  787. ownership solely within the current scope. Because it is noncopyable, it is safer than <code>shared_ptr</code>
  788. for pointers which should not be copied.</p>
  789. </div>
  790. <div class="paragraph">
  791. <p>Because <code>scoped_ptr</code> is simple, in its usual implementation every operation is as fast as for a
  792. built-in pointer and it has no more space overhead that a built-in pointer.</p>
  793. </div>
  794. <div class="paragraph">
  795. <p><code>scoped_ptr</code> cannot be used in C&#43;&#43; Standard Library containers. Use <code>shared_ptr</code> or <code>std::unique_ptr</code>
  796. if you need a smart pointer that can.</p>
  797. </div>
  798. <div class="paragraph">
  799. <p><code>scoped_ptr</code> cannot correctly hold a pointer to a dynamically allocated array. See <code>scoped_array</code> for that usage.</p>
  800. </div>
  801. <div class="paragraph">
  802. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to. Destroying <code>T</code> must not thow exceptions,
  803. and <code>T</code> must be complete at the point <code>scoped_ptr&lt;T&gt;::~scoped_ptr</code> is instantiated.</p>
  804. </div>
  805. </div>
  806. <div class="sect2">
  807. <h3 id="scoped_ptr_synopsis">Synopsis</h3>
  808. <div class="paragraph">
  809. <p><code>scoped_ptr</code> is defined in <code>&lt;boost/smart_ptr/scoped_ptr.hpp&gt;</code>.</p>
  810. </div>
  811. <div class="listingblock">
  812. <div class="content">
  813. <pre class="highlight"><code>namespace boost {
  814. template&lt;class T&gt; class scoped_ptr {
  815. private:
  816. scoped_ptr(scoped_ptr const&amp;);
  817. scoped_ptr&amp; operator=(scoped_ptr const&amp;);
  818. void operator==(scoped_ptr const&amp;) const;
  819. void operator!=(scoped_ptr const&amp;) const;
  820. public:
  821. typedef T element_type;
  822. explicit scoped_ptr(T * p = 0) noexcept;
  823. ~scoped_ptr() noexcept;
  824. void reset(T * p = 0) noexcept;
  825. T &amp; operator*() const noexcept;
  826. T * operator-&gt;() const noexcept;
  827. T * get() const noexcept;
  828. explicit operator bool() const noexcept;
  829. void swap(scoped_ptr &amp; b) noexcept;
  830. };
  831. template&lt;class T&gt; void swap(scoped_ptr&lt;T&gt; &amp; a, scoped_ptr&lt;T&gt; &amp; b) noexcept;
  832. template&lt;class T&gt;
  833. bool operator==( scoped_ptr&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;
  834. template&lt;class T&gt;
  835. bool operator==( std::nullptr_t, scoped_ptr&lt;T&gt; const &amp; p ) noexcept;
  836. template&lt;class T&gt;
  837. bool operator!=( scoped_ptr&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;
  838. template&lt;class T&gt;
  839. bool operator!=( std::nullptr_t, scoped_ptr&lt;T&gt; const &amp; p ) noexcept;
  840. }</code></pre>
  841. </div>
  842. </div>
  843. </div>
  844. <div class="sect2">
  845. <h3 id="scoped_ptr_members">Members</h3>
  846. <div class="sect3">
  847. <h4 id="scoped_ptr_element_type">element_type</h4>
  848. <div class="literalblock">
  849. <div class="content">
  850. <pre>typedef T element_type;</pre>
  851. </div>
  852. </div>
  853. <div class="paragraph">
  854. <p>Provides the type of the stored pointer.</p>
  855. </div>
  856. </div>
  857. <div class="sect3">
  858. <h4 id="scoped_ptr_constructor">constructor</h4>
  859. <div class="literalblock">
  860. <div class="content">
  861. <pre>explicit scoped_ptr(T * p = 0) noexcept;</pre>
  862. </div>
  863. </div>
  864. <div class="paragraph">
  865. <p>Constructs a <code>scoped_ptr</code>, storing a copy of <code>p</code>, which must have been allocated via a
  866. C&#43;&#43; <code>new</code> expression or be 0. <code>T</code> is not required be a complete type.</p>
  867. </div>
  868. </div>
  869. <div class="sect3">
  870. <h4 id="scoped_ptr_destructor">destructor</h4>
  871. <div class="literalblock">
  872. <div class="content">
  873. <pre>~scoped_ptr() noexcept;</pre>
  874. </div>
  875. </div>
  876. <div class="paragraph">
  877. <p>Destroys the object pointed to by the stored pointer, if any, as if by using
  878. <code>delete this-&gt;get()</code>. <code>T</code> must be a complete type.</p>
  879. </div>
  880. </div>
  881. <div class="sect3">
  882. <h4 id="scoped_ptr_reset">reset</h4>
  883. <div class="literalblock">
  884. <div class="content">
  885. <pre>void reset(T * p = 0) noexcept;</pre>
  886. </div>
  887. </div>
  888. <div class="paragraph">
  889. <p>Deletes the object pointed to by the stored pointer and then stores a copy of
  890. <code>p</code>, which must have been allocated via a C&#43;&#43; <code>new</code> expression or be 0.</p>
  891. </div>
  892. <div class="paragraph">
  893. <p>Since the previous object needs to be deleted, <code>T</code> must be a complete type.</p>
  894. </div>
  895. </div>
  896. <div class="sect3">
  897. <h4 id="scoped_ptr_indirection">indirection</h4>
  898. <div class="literalblock">
  899. <div class="content">
  900. <pre>T &amp; operator*() const noexcept;</pre>
  901. </div>
  902. </div>
  903. <div class="paragraph">
  904. <p>Returns a reference to the object pointed to by the stored pointer. Behavior is undefined if the stored pointer is 0.</p>
  905. </div>
  906. <div class="literalblock">
  907. <div class="content">
  908. <pre>T * operator-&gt;() const noexcept;</pre>
  909. </div>
  910. </div>
  911. <div class="paragraph">
  912. <p>Returns the stored pointer. Behavior is undefined if the stored pointer is 0.</p>
  913. </div>
  914. </div>
  915. <div class="sect3">
  916. <h4 id="scoped_ptr_get">get</h4>
  917. <div class="literalblock">
  918. <div class="content">
  919. <pre>T * get() const noexcept;</pre>
  920. </div>
  921. </div>
  922. <div class="paragraph">
  923. <p>Returns the stored pointer. <code>T</code> need not be a complete type.</p>
  924. </div>
  925. </div>
  926. <div class="sect3">
  927. <h4 id="scoped_ptr_conversions">conversions</h4>
  928. <div class="literalblock">
  929. <div class="content">
  930. <pre>explicit operator bool () const noexcept; // never throws</pre>
  931. </div>
  932. </div>
  933. <div class="paragraph">
  934. <p>Returns <code>get() != 0</code>.</p>
  935. </div>
  936. <div class="admonitionblock note">
  937. <table>
  938. <tr>
  939. <td class="icon">
  940. <div class="title">Note</div>
  941. </td>
  942. <td class="content">
  943. On C++03 compilers, the return value is of an unspecified type.
  944. </td>
  945. </tr>
  946. </table>
  947. </div>
  948. </div>
  949. <div class="sect3">
  950. <h4 id="scoped_ptr_swap">swap</h4>
  951. <div class="literalblock">
  952. <div class="content">
  953. <pre>void swap(scoped_ptr &amp; b) noexcept;</pre>
  954. </div>
  955. </div>
  956. <div class="paragraph">
  957. <p>Exchanges the contents of the two smart pointers. <code>T</code> need not be a complete type.</p>
  958. </div>
  959. </div>
  960. </div>
  961. <div class="sect2">
  962. <h3 id="scoped_ptr_free_functions">Free Functions</h3>
  963. <div class="sect3">
  964. <h4 id="scoped_ptr_swap_2">swap</h4>
  965. <div class="literalblock">
  966. <div class="content">
  967. <pre>template&lt;class T&gt; void swap(scoped_ptr&lt;T&gt; &amp; a, scoped_ptr&lt;T&gt; &amp; b) noexcept;</pre>
  968. </div>
  969. </div>
  970. <div class="paragraph">
  971. <p>Equivalent to <code>a.swap(b)</code>.</p>
  972. </div>
  973. </div>
  974. <div class="sect3">
  975. <h4 id="scoped_ptr_comparisons">comparisons</h4>
  976. <div class="literalblock">
  977. <div class="content">
  978. <pre>template&lt;class T&gt; bool operator==( scoped_ptr&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;</pre>
  979. </div>
  980. </div>
  981. <div class="literalblock">
  982. <div class="content">
  983. <pre>template&lt;class T&gt; bool operator==( std::nullptr_t, scoped_ptr&lt;T&gt; const &amp; p ) noexcept;</pre>
  984. </div>
  985. </div>
  986. <div class="paragraph">
  987. <p>Returns <code>p.get() == nullptr</code>.</p>
  988. </div>
  989. <div class="literalblock">
  990. <div class="content">
  991. <pre>template&lt;class T&gt; bool operator!=( scoped_ptr&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;</pre>
  992. </div>
  993. </div>
  994. <div class="literalblock">
  995. <div class="content">
  996. <pre>template&lt;class T&gt; bool operator!=( std::nullptr_t, scoped_ptr&lt;T&gt; const &amp; p ) noexcept;</pre>
  997. </div>
  998. </div>
  999. <div class="paragraph">
  1000. <p>Returns <code>p.get() != nullptr</code>.</p>
  1001. </div>
  1002. </div>
  1003. </div>
  1004. <div class="sect2">
  1005. <h3 id="scoped_ptr_example">Example</h3>
  1006. <div class="paragraph">
  1007. <p>Here&#8217;s an example that uses <code>scoped_ptr</code>.</p>
  1008. </div>
  1009. <div class="listingblock">
  1010. <div class="content">
  1011. <pre class="highlight"><code>#include &lt;boost/scoped_ptr.hpp&gt;
  1012. #include &lt;iostream&gt;
  1013. struct Shoe { ~Shoe() { std::cout &lt;&lt; "Buckle my shoe\n"; } };
  1014. class MyClass {
  1015. boost::scoped_ptr&lt;int&gt; ptr;
  1016. public:
  1017. MyClass() : ptr(new int) { *ptr = 0; }
  1018. int add_one() { return ++*ptr; }
  1019. };
  1020. int main()
  1021. {
  1022. boost::scoped_ptr&lt;Shoe&gt; x(new Shoe);
  1023. MyClass my_instance;
  1024. std::cout &lt;&lt; my_instance.add_one() &lt;&lt; '\n';
  1025. std::cout &lt;&lt; my_instance.add_one() &lt;&lt; '\n';
  1026. }</code></pre>
  1027. </div>
  1028. </div>
  1029. <div class="paragraph">
  1030. <p>The example program produces the beginning of a child&#8217;s nursery rhyme:</p>
  1031. </div>
  1032. <div class="listingblock">
  1033. <div class="content">
  1034. <pre class="highlight"><code>1
  1035. 2
  1036. Buckle my shoe</code></pre>
  1037. </div>
  1038. </div>
  1039. </div>
  1040. <div class="sect2">
  1041. <h3 id="scoped_ptr_rationale">Rationale</h3>
  1042. <div class="paragraph">
  1043. <p>The primary reason to use <code>scoped_ptr</code> rather than <code>std::auto_ptr</code> or <code>std::unique_ptr</code> is to let readers of your code
  1044. know that you intend "resource acquisition is initialization" to be applied only for the current scope, and have no intent to transfer ownership.</p>
  1045. </div>
  1046. <div class="paragraph">
  1047. <p>A secondary reason to use <code>scoped_ptr</code> is to prevent a later maintenance programmer from adding a function that transfers
  1048. ownership by returning the <code>auto_ptr</code>, because the maintenance programmer saw <code>auto_ptr</code>, and assumed ownership could safely be transferred.</p>
  1049. </div>
  1050. <div class="paragraph">
  1051. <p>Think of <code>bool</code> vs <code>int</code>. We all know that under the covers <code>bool</code> is usually just an <code>int</code>. Indeed, some argued against including bool in the C&#43;&#43;
  1052. standard because of that. But by coding <code>bool</code> rather than <code>int</code>, you tell your readers what your intent is. Same with <code>scoped_ptr</code>; by using it you are signaling intent.</p>
  1053. </div>
  1054. <div class="paragraph">
  1055. <p>It has been suggested that <code>scoped_ptr&lt;T&gt;</code> is equivalent to <code>std::auto_ptr&lt;T&gt; const</code>. Ed Brey pointed out, however, that <code>reset</code> will not work on a <code>std::auto_ptr&lt;T&gt; const</code>.</p>
  1056. </div>
  1057. </div>
  1058. <div class="sect2">
  1059. <h3 id="scoped_ptr_handlebody_idiom">Handle/Body Idiom</h3>
  1060. <div class="paragraph">
  1061. <p>One common usage of <code>scoped_ptr</code> is to implement a handle/body (also called pimpl) idiom which avoids exposing the body (implementation) in the header file.</p>
  1062. </div>
  1063. <div class="paragraph">
  1064. <p>The <code><a href="../../example/scoped_ptr_example_test.cpp">scoped_ptr_example_test.cpp</a></code> sample program includes a header file,
  1065. <code><a href="../../example/scoped_ptr_example.hpp">scoped_ptr_example.hpp</a></code>, which uses a <code>scoped_ptr&lt;&gt;</code> to an incomplete type to hide the
  1066. implementation. The instantiation of member functions which require a complete type occurs in the <code><a href="../../example/scoped_ptr_example.cpp">scoped_ptr_example.cpp</a></code>
  1067. implementation file.</p>
  1068. </div>
  1069. </div>
  1070. <div class="sect2">
  1071. <h3 id="scoped_ptr_frequently_asked_questions">Frequently Asked Questions</h3>
  1072. <div class="qlist qanda">
  1073. <ol>
  1074. <li>
  1075. <p><em>Why doesn&#8217;t <code>scoped_ptr</code> have a <code>release()</code> member?</em></p>
  1076. <p>When reading source code, it is valuable to be able to draw conclusions about program behavior based on the types being used. If <code>scoped_ptr</code> had a <code>release()</code> member,
  1077. it would become possible to transfer ownership of the held pointer, weakening its role as a way of limiting resource lifetime to a given context. Use <code>std::auto_ptr</code> where
  1078. transfer of ownership is required. (supplied by Dave Abrahams)</p>
  1079. </li>
  1080. </ol>
  1081. </div>
  1082. </div>
  1083. </div>
  1084. </div>
  1085. <div class="sect1">
  1086. <h2 id="scoped_array">scoped_array: Scoped Array Ownership</h2>
  1087. <div class="sectionbody">
  1088. <div class="sect2">
  1089. <h3 id="scoped_array_description">Description</h3>
  1090. <div class="paragraph">
  1091. <p>The <code>scoped_array</code> class template stores a pointer to a dynamically allocated array.
  1092. (Dynamically allocated arrays are allocated with the C&#43;&#43; <code>new[]</code> expression.) The array
  1093. pointed to is guaranteed to be deleted, either on destruction of the <code>scoped_array</code>,
  1094. or via an explicit <code>reset</code>.</p>
  1095. </div>
  1096. <div class="paragraph">
  1097. <p>The <code>scoped_array</code> template is a simple solution for simple needs. It supplies a basic
  1098. "resource acquisition is initialization" facility, without shared-ownership or
  1099. transfer-of-ownership semantics. Both its name and enforcement of semantics
  1100. (by being noncopyable) signal its intent to retain ownership solely within the current scope.
  1101. Because it is noncopyable, it is safer than <code>shared_ptr&lt;T[]&gt;</code> for pointers which should not be copied.</p>
  1102. </div>
  1103. <div class="paragraph">
  1104. <p>Because <code>scoped_array</code> is so simple, in its usual implementation every operation is as fast as a
  1105. built-in array pointer and it has no more space overhead that a built-in array pointer.</p>
  1106. </div>
  1107. <div class="paragraph">
  1108. <p>It cannot be used in C&#43;&#43; standard library containers. See <code>shared_ptr&lt;T[]&gt;</code> if <code>scoped_array</code>
  1109. does not meet your needs.</p>
  1110. </div>
  1111. <div class="paragraph">
  1112. <p>It cannot correctly hold a pointer to a single object. See <code>scoped_ptr</code> for that usage.</p>
  1113. </div>
  1114. <div class="paragraph">
  1115. <p><code>std::vector</code> is an alternative to <code>scoped_array</code> that is a bit heavier duty but far more flexible.
  1116. <code>boost::array</code> is an alternative that does not use dynamic allocation.</p>
  1117. </div>
  1118. <div class="paragraph">
  1119. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to.</p>
  1120. </div>
  1121. </div>
  1122. <div class="sect2">
  1123. <h3 id="scoped_array_synopsis">Synopsis</h3>
  1124. <div class="paragraph">
  1125. <p><code>scoped_array</code> is defined in <code>&lt;boost/smart_ptr/scoped_array.hpp&gt;</code>.</p>
  1126. </div>
  1127. <div class="listingblock">
  1128. <div class="content">
  1129. <pre class="highlight"><code>namespace boost {
  1130. template&lt;class T&gt; class scoped_array {
  1131. private:
  1132. scoped_array(scoped_array const &amp;);
  1133. scoped_array &amp; operator=(scoped_array const &amp;);
  1134. void operator==( scoped_array const&amp; ) const;
  1135. void operator!=( scoped_array const&amp; ) const;
  1136. public:
  1137. typedef T element_type;
  1138. explicit scoped_array(T * p = 0) noexcept;
  1139. ~scoped_array() noexcept;
  1140. void reset(T * p = 0) noexcept;
  1141. T &amp; operator[](std::ptrdiff_t i) const noexcept;
  1142. T * get() const noexcept;
  1143. explicit operator bool () const noexcept;
  1144. void swap(scoped_array &amp; b) noexcept;
  1145. };
  1146. template&lt;class T&gt; void swap(scoped_array&lt;T&gt; &amp; a, scoped_array&lt;T&gt; &amp; b) noexcept;
  1147. template&lt;class T&gt;
  1148. bool operator==( scoped_array&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;
  1149. template&lt;class T&gt;
  1150. bool operator==( std::nullptr_t, scoped_array&lt;T&gt; const &amp; p ) noexcept;
  1151. template&lt;class T&gt;
  1152. bool operator!=( scoped_array&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;
  1153. template&lt;class T&gt;
  1154. bool operator!=( std::nullptr_t, scoped_array&lt;T&gt; const &amp; p ) noexcept;
  1155. }</code></pre>
  1156. </div>
  1157. </div>
  1158. </div>
  1159. <div class="sect2">
  1160. <h3 id="scoped_array_members">Members</h3>
  1161. <div class="sect3">
  1162. <h4 id="scoped_array_element_type">element_type</h4>
  1163. <div class="literalblock">
  1164. <div class="content">
  1165. <pre>typedef T element_type;</pre>
  1166. </div>
  1167. </div>
  1168. <div class="paragraph">
  1169. <p>Provides the type of the stored pointer.</p>
  1170. </div>
  1171. </div>
  1172. <div class="sect3">
  1173. <h4 id="scoped_array_constructors">constructors</h4>
  1174. <div class="literalblock">
  1175. <div class="content">
  1176. <pre>explicit scoped_array(T * p = 0) noexcept;</pre>
  1177. </div>
  1178. </div>
  1179. <div class="paragraph">
  1180. <p>Constructs a <code>scoped_array</code>, storing a copy of <code>p</code>, which must have been
  1181. allocated via a C&#43;&#43; <code>new[]</code> expression or be 0. <code>T</code> is not required be a complete type.</p>
  1182. </div>
  1183. </div>
  1184. <div class="sect3">
  1185. <h4 id="scoped_array_destructor">destructor</h4>
  1186. <div class="literalblock">
  1187. <div class="content">
  1188. <pre>~scoped_array() noexcept;</pre>
  1189. </div>
  1190. </div>
  1191. <div class="paragraph">
  1192. <p>Deletes the array pointed to by the stored pointer. Note that <code>delete[]</code> on a pointer with
  1193. a value of 0 is harmless. <code>T</code> must be complete, and <code>delete[]</code> on the stored pointer must
  1194. not throw exceptions.</p>
  1195. </div>
  1196. </div>
  1197. <div class="sect3">
  1198. <h4 id="scoped_array_reset">reset</h4>
  1199. <div class="literalblock">
  1200. <div class="content">
  1201. <pre>void reset(T * p = 0) noexcept;</pre>
  1202. </div>
  1203. </div>
  1204. <div class="paragraph">
  1205. <p>Deletes the array pointed to by the stored pointer and then stores a copy of <code>p</code>,
  1206. which must have been allocated via a C&#43;&#43; <code>new[]</code> expression or be 0. <code>T</code> must be complete,
  1207. and <code>delete[]</code> on the stored pointer must not throw exceptions.</p>
  1208. </div>
  1209. </div>
  1210. <div class="sect3">
  1211. <h4 id="scoped_array_subscripting">subscripting</h4>
  1212. <div class="literalblock">
  1213. <div class="content">
  1214. <pre>T &amp; operator[](std::ptrdiff_t i) const noexcept;</pre>
  1215. </div>
  1216. </div>
  1217. <div class="paragraph">
  1218. <p>Returns a reference to element <code>i</code> of the array pointed to by the stored pointer.
  1219. Behavior is undefined and almost certainly undesirable if the stored pointer is 0,
  1220. or if <code>i</code> is less than 0 or is greater than or equal to the number of elements in
  1221. the array.</p>
  1222. </div>
  1223. </div>
  1224. <div class="sect3">
  1225. <h4 id="scoped_array_get">get</h4>
  1226. <div class="literalblock">
  1227. <div class="content">
  1228. <pre>T * get() const noexcept;</pre>
  1229. </div>
  1230. </div>
  1231. <div class="paragraph">
  1232. <p>Returns the stored pointer. <code>T</code> need not be a complete type.</p>
  1233. </div>
  1234. </div>
  1235. <div class="sect3">
  1236. <h4 id="scoped_array_conversions">conversions</h4>
  1237. <div class="literalblock">
  1238. <div class="content">
  1239. <pre>explicit operator bool () const noexcept;</pre>
  1240. </div>
  1241. </div>
  1242. <div class="paragraph">
  1243. <p>Returns <code>get() != 0</code>.</p>
  1244. </div>
  1245. <div class="admonitionblock note">
  1246. <table>
  1247. <tr>
  1248. <td class="icon">
  1249. <div class="title">Note</div>
  1250. </td>
  1251. <td class="content">
  1252. On C++03 compilers, the return value is of an unspecified type.
  1253. </td>
  1254. </tr>
  1255. </table>
  1256. </div>
  1257. </div>
  1258. <div class="sect3">
  1259. <h4 id="scoped_array_swap">swap</h4>
  1260. <div class="literalblock">
  1261. <div class="content">
  1262. <pre>void swap(scoped_array &amp; b) noexcept;</pre>
  1263. </div>
  1264. </div>
  1265. <div class="paragraph">
  1266. <p>Exchanges the contents of the two smart pointers. <code>T</code> need not be a complete type.</p>
  1267. </div>
  1268. </div>
  1269. </div>
  1270. <div class="sect2">
  1271. <h3 id="scoped_array_free_functions">Free Functions</h3>
  1272. <div class="sect3">
  1273. <h4 id="scoped_array_swap_2">swap</h4>
  1274. <div class="literalblock">
  1275. <div class="content">
  1276. <pre>template&lt;class T&gt; void swap(scoped_array&lt;T&gt; &amp; a, scoped_array&lt;T&gt; &amp; b) noexcept;</pre>
  1277. </div>
  1278. </div>
  1279. <div class="paragraph">
  1280. <p>Equivalent to <code>a.swap(b)</code>.</p>
  1281. </div>
  1282. </div>
  1283. <div class="sect3">
  1284. <h4 id="scoped_array_comparisons">comparisons</h4>
  1285. <div class="literalblock">
  1286. <div class="content">
  1287. <pre>template&lt;class T&gt;
  1288. bool operator==( scoped_array&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;</pre>
  1289. </div>
  1290. </div>
  1291. <div class="literalblock">
  1292. <div class="content">
  1293. <pre>template&lt;class T&gt;
  1294. bool operator==( std::nullptr_t, scoped_array&lt;T&gt; const &amp; p ) noexcept;</pre>
  1295. </div>
  1296. </div>
  1297. <div class="paragraph">
  1298. <p>Returns <code>p.get() == nullptr</code>.</p>
  1299. </div>
  1300. <div class="literalblock">
  1301. <div class="content">
  1302. <pre>template&lt;class T&gt;
  1303. bool operator!=( scoped_array&lt;T&gt; const &amp; p, std::nullptr_t ) noexcept;</pre>
  1304. </div>
  1305. </div>
  1306. <div class="literalblock">
  1307. <div class="content">
  1308. <pre>template&lt;class T&gt;
  1309. bool operator!=( std::nullptr_t, scoped_array&lt;T&gt; const &amp; p ) noexcept;</pre>
  1310. </div>
  1311. </div>
  1312. <div class="paragraph">
  1313. <p>Returns <code>p.get() != nullptr</code>.</p>
  1314. </div>
  1315. </div>
  1316. </div>
  1317. </div>
  1318. </div>
  1319. <div class="sect1">
  1320. <h2 id="shared_ptr">shared_ptr: Shared Ownership</h2>
  1321. <div class="sectionbody">
  1322. <div class="sect2">
  1323. <h3 id="shared_ptr_description">Description</h3>
  1324. <div class="paragraph">
  1325. <p>The <code>shared_ptr</code> class template stores a pointer to a dynamically allocated object, typically with a C&#43;&#43; <code>new</code>-expression.
  1326. The object pointed to is guaranteed to be deleted when the last <code>shared_ptr</code> pointing to it is destroyed or reset.</p>
  1327. </div>
  1328. <div class="listingblock">
  1329. <div class="title">Code Example 1. Using shared_ptr</div>
  1330. <div class="content">
  1331. <pre class="highlight"><code>shared_ptr&lt;X&gt; p1( new X );
  1332. shared_ptr&lt;void&gt; p2( new int(5) );</code></pre>
  1333. </div>
  1334. </div>
  1335. <div class="paragraph">
  1336. <p><code>shared_ptr</code> deletes the exact pointer that has been passed at construction time, complete with its original type, regardless
  1337. of the template parameter. In the second example above, when <code>p2</code> is destroyed or reset, it will call <code>delete</code> on the original
  1338. <code>int*</code> that has been passed to the constructor, even though <code>p2</code> itself is of type <code>shared_ptr&lt;void&gt;</code> and stores a pointer of
  1339. type <code>void*</code>.</p>
  1340. </div>
  1341. <div class="paragraph">
  1342. <p>Every <code>shared_ptr</code> meets the <code>CopyConstructible</code>, <code>MoveConstructible</code>, <code>CopyAssignable</code> and <code>MoveAssignable</code> requirements of the
  1343. C&#43;&#43; Standard Library, and can be used in standard library containers. Comparison operators are supplied so that <code>shared_ptr</code>
  1344. works with the standard library&#8217;s associative containers.</p>
  1345. </div>
  1346. <div class="paragraph">
  1347. <p>Because the implementation uses reference counting, cycles of <code>shared_ptr</code> instances will not be reclaimed. For example, if <code>main()</code>
  1348. holds a <code>shared_ptr</code> to <code>A</code>, which directly or indirectly holds a <code>shared_ptr</code> back to <code>A</code>, <code>A&#8217;s use count will be 2. Destruction
  1349. of the original `shared_ptr</code> will leave <code>A</code> dangling with a use count of 1. Use <code><a href="#weak_ptr">weak_ptr</a></code> to "break cycles."</p>
  1350. </div>
  1351. <div class="paragraph">
  1352. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to. <code>shared_ptr</code> and most of its member functions place
  1353. no requirements on <code>T</code>; it is allowed to be an incomplete type, or <code>void</code>. Member functions that do place additional requirements
  1354. (constructors, <code>reset</code>) are explicitly documented below.</p>
  1355. </div>
  1356. <div class="paragraph">
  1357. <p><code>shared_ptr&lt;T&gt;</code> can be implicitly converted to <code>shared_ptr&lt;U&gt;</code> whenever <code>T*</code> can be implicitly converted to <code>U*</code>. In particular,
  1358. <code>shared_ptr&lt;T&gt;</code> is implicitly convertible to <code>shared_ptr&lt;T const&gt;</code>, to <code>shared_ptr&lt;U&gt;</code> where <code>U</code> is an accessible base of <code>T</code>,
  1359. and to <code>shared_ptr&lt;void&gt;</code>.</p>
  1360. </div>
  1361. <div class="paragraph">
  1362. <p><code>shared_ptr</code> is now part of the C++11 Standard, as <code>std::shared_ptr</code>.</p>
  1363. </div>
  1364. <div class="paragraph">
  1365. <p>Starting with Boost release 1.53, <code>shared_ptr</code> can be used to hold a pointer to a dynamically allocated array. This is accomplished
  1366. by using an array type (<code>T[]</code> or <code>T[N]</code>) as the template parameter. There is almost no difference between using an unsized array,
  1367. <code>T[]</code>, and a sized array, <code>T[N]</code>; the latter just enables <code>operator[]</code> to perform a range check on the index.</p>
  1368. </div>
  1369. <div class="listingblock">
  1370. <div class="title">Code Example 2. Using shared_ptr with arrays</div>
  1371. <div class="content">
  1372. <pre class="highlight"><code>shared_ptr&lt;double[1024]&gt; p1( new double[1024] );
  1373. shared_ptr&lt;double[]&gt; p2( new double[n] );</code></pre>
  1374. </div>
  1375. </div>
  1376. </div>
  1377. <div class="sect2">
  1378. <h3 id="shared_ptr_best_practices">Best Practices</h3>
  1379. <div class="paragraph">
  1380. <p>A simple guideline that nearly eliminates the possibility of memory leaks is: always use a named smart pointer variable to hold the result
  1381. of <code>new</code>. Every occurence of the <code>new</code> keyword in the code should have the form:</p>
  1382. </div>
  1383. <div class="literalblock">
  1384. <div class="content">
  1385. <pre>shared_ptr&lt;T&gt; p(new Y);</pre>
  1386. </div>
  1387. </div>
  1388. <div class="paragraph">
  1389. <p>It is, of course, acceptable to use another smart pointer in place of <code>shared_ptr</code> above; having <code>T</code> and <code>Y</code> be the same type, or passing
  1390. arguments to the constructor of <code>Y</code> is also OK.</p>
  1391. </div>
  1392. <div class="paragraph">
  1393. <p>If you observe this guideline, it naturally follows that you will have no explicit <code>delete</code> statements; <code>try</code>/<code>catch</code> constructs will be rare.</p>
  1394. </div>
  1395. <div class="paragraph">
  1396. <p>Avoid using unnamed <code>shared_ptr</code> temporaries to save typing; to see why this is dangerous, consider this example:</p>
  1397. </div>
  1398. <div class="listingblock">
  1399. <div class="title">Code Example 3. Exception-safe and -unsafe use of shared_ptr</div>
  1400. <div class="content">
  1401. <pre class="highlight"><code>void f(shared_ptr&lt;int&gt;, int);
  1402. int g();
  1403. void ok()
  1404. {
  1405. shared_ptr&lt;int&gt; p( new int(2) );
  1406. f( p, g() );
  1407. }
  1408. void bad()
  1409. {
  1410. f( shared_ptr&lt;int&gt;( new int(2) ), g() );
  1411. }</code></pre>
  1412. </div>
  1413. </div>
  1414. <div class="paragraph">
  1415. <p>The function <code>ok</code> follows the guideline to the letter, whereas <code>bad</code> constructs the temporary <code>shared_ptr</code> in place, admitting the possibility of
  1416. a memory leak. Since function arguments are evaluated in unspecified order, it is possible for <code>new int(2)</code> to be evaluated first, <code>g()</code> second,
  1417. and we may never get to the <code>shared_ptr</code> constructor if <code>g</code> throws an exception. See <a href="http://www.gotw.ca/gotw/056.htm">Herb Sutter&#8217;s treatment</a> of
  1418. the issue for more information.</p>
  1419. </div>
  1420. <div class="paragraph">
  1421. <p>The exception safety problem described above may also be eliminated by using the <code><a href="#make_shared">make_shared</a></code> or <code>allocate_shared</code> factory
  1422. functions defined in <code>&lt;boost/smart_ptr/make_shared.hpp&gt;</code>. These factory functions also provide an efficiency benefit by consolidating allocations.</p>
  1423. </div>
  1424. </div>
  1425. <div class="sect2">
  1426. <h3 id="shared_ptr_synopsis">Synopsis</h3>
  1427. <div class="paragraph">
  1428. <p><code>shared_ptr</code> is defined in <code>&lt;boost/smart_ptr/shared_ptr.hpp&gt;</code>.</p>
  1429. </div>
  1430. <div class="listingblock">
  1431. <div class="content">
  1432. <pre class="highlight"><code>namespace boost {
  1433. class bad_weak_ptr: public std::exception;
  1434. template&lt;class T&gt; class weak_ptr;
  1435. template&lt;class T&gt; class shared_ptr {
  1436. public:
  1437. typedef /*see below*/ element_type;
  1438. constexpr shared_ptr() noexcept;
  1439. constexpr shared_ptr(std::nullptr_t) noexcept;
  1440. template&lt;class Y&gt; explicit shared_ptr(Y * p);
  1441. template&lt;class Y, class D&gt; shared_ptr(Y * p, D d);
  1442. template&lt;class Y, class D, class A&gt; shared_ptr(Y * p, D d, A a);
  1443. template&lt;class D&gt; shared_ptr(std::nullptr_t p, D d);
  1444. template&lt;class D, class A&gt; shared_ptr(std::nullptr_t p, D d, A a);
  1445. ~shared_ptr() noexcept;
  1446. shared_ptr(shared_ptr const &amp; r) noexcept;
  1447. template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  1448. shared_ptr(shared_ptr &amp;&amp; r) noexcept;
  1449. template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;
  1450. template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  1451. template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;
  1452. template&lt;class Y&gt; explicit shared_ptr(weak_ptr&lt;Y&gt; const &amp; r);
  1453. template&lt;class Y&gt; explicit shared_ptr(std::auto_ptr&lt;Y&gt; &amp; r);
  1454. template&lt;class Y&gt; shared_ptr(std::auto_ptr&lt;Y&gt; &amp;&amp; r);
  1455. template&lt;class Y, class D&gt; shared_ptr(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);
  1456. shared_ptr &amp; operator=(shared_ptr const &amp; r) noexcept;
  1457. template&lt;class Y&gt; shared_ptr &amp; operator=(shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  1458. shared_ptr &amp; operator=(shared_ptr const &amp;&amp; r) noexcept;
  1459. template&lt;class Y&gt; shared_ptr &amp; operator=(shared_ptr&lt;Y&gt; const &amp;&amp; r) noexcept;
  1460. template&lt;class Y&gt; shared_ptr &amp; operator=(std::auto_ptr&lt;Y&gt; &amp; r);
  1461. template&lt;class Y&gt; shared_ptr &amp; operator=(std::auto_ptr&lt;Y&gt; &amp;&amp; r);
  1462. template&lt;class Y, class D&gt; shared_ptr &amp; operator=(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);
  1463. shared_ptr &amp; operator=(std::nullptr_t) noexcept;
  1464. void reset() noexcept;
  1465. template&lt;class Y&gt; void reset(Y * p);
  1466. template&lt;class Y, class D&gt; void reset(Y * p, D d);
  1467. template&lt;class Y, class D, class A&gt; void reset(Y * p, D d, A a);
  1468. template&lt;class Y&gt; void reset(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  1469. template&lt;class Y&gt; void reset(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;
  1470. T &amp; operator*() const noexcept; // only valid when T is not an array type
  1471. T * operator-&gt;() const noexcept; // only valid when T is not an array type
  1472. // only valid when T is an array type
  1473. element_type &amp; operator[](std::ptrdiff_t i) const noexcept;
  1474. element_type * get() const noexcept;
  1475. bool unique() const noexcept;
  1476. long use_count() const noexcept;
  1477. explicit operator bool() const noexcept;
  1478. void swap(shared_ptr &amp; b) noexcept;
  1479. template&lt;class Y&gt; bool owner_before(shared_ptr&lt;Y&gt; const &amp; rhs) const noexcept;
  1480. template&lt;class Y&gt; bool owner_before(weak_ptr&lt;Y&gt; const &amp; rhs) const noexcept;
  1481. };
  1482. template&lt;class T, class U&gt;
  1483. bool operator==(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;
  1484. template&lt;class T, class U&gt;
  1485. bool operator!=(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;
  1486. template&lt;class T, class U&gt;
  1487. bool operator&lt;(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;
  1488. template&lt;class T&gt; bool operator==(shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;
  1489. template&lt;class T&gt; bool operator==(std::nullptr_t, shared_ptr&lt;T&gt; const &amp; p) noexcept;
  1490. template&lt;class T&gt; bool operator!=(shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;
  1491. template&lt;class T&gt; bool operator!=(std::nullptr_t, shared_ptr&lt;T&gt; const &amp; p) noexcept;
  1492. template&lt;class T&gt; void swap(shared_ptr&lt;T&gt; &amp; a, shared_ptr&lt;T&gt; &amp; b) noexcept;
  1493. template&lt;class T&gt;
  1494. typename shared_ptr&lt;T&gt;::element_type *
  1495. get_pointer(shared_ptr&lt;T&gt; const &amp; p) noexcept;
  1496. template&lt;class T, class U&gt;
  1497. shared_ptr&lt;T&gt; static_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;
  1498. template&lt;class T, class U&gt;
  1499. shared_ptr&lt;T&gt; const_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;
  1500. template&lt;class T, class U&gt;
  1501. shared_ptr&lt;T&gt; dynamic_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;
  1502. template&lt;class T, class U&gt;
  1503. shared_ptr&lt;T&gt; reinterpret_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;
  1504. template&lt;class E, class T, class Y&gt;
  1505. std::basic_ostream&lt;E, T&gt; &amp;
  1506. operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os, shared_ptr&lt;Y&gt; const &amp; p);
  1507. template&lt;class D, class T&gt; D * get_deleter(shared_ptr&lt;T&gt; const &amp; p) noexcept;
  1508. template&lt;class T&gt; bool atomic_is_lock_free( shared_ptr&lt;T&gt; const * p ) noexcept;
  1509. template&lt;class T&gt; shared_ptr&lt;T&gt; atomic_load( shared_ptr&lt;T&gt; const * p ) noexcept;
  1510. template&lt;class T&gt;
  1511. shared_ptr&lt;T&gt; atomic_load_explicit( shared_ptr&lt;T&gt; const * p, int ) noexcept;
  1512. template&lt;class T&gt;
  1513. void atomic_store( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r ) noexcept;
  1514. template&lt;class T&gt;
  1515. void atomic_store_explicit( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r, int ) noexcept;
  1516. template&lt;class T&gt;
  1517. shared_ptr&lt;T&gt; atomic_exchange( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r ) noexcept;
  1518. template&lt;class T&gt;
  1519. shared_ptr&lt;T&gt; atomic_exchange_explicit(
  1520. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r, int ) noexcept;
  1521. template&lt;class T&gt;
  1522. bool atomic_compare_exchange(
  1523. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; * v, shared_ptr&lt;T&gt; w ) noexcept;
  1524. template&lt;class T&gt;
  1525. bool atomic_compare_exchange_explicit(
  1526. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; * v, shared_ptr&lt;T&gt; w, int, int ) noexcept;
  1527. }</code></pre>
  1528. </div>
  1529. </div>
  1530. </div>
  1531. <div class="sect2">
  1532. <h3 id="shared_ptr_members">Members</h3>
  1533. <div class="sect3">
  1534. <h4 id="shared_ptr_element_type">element_type</h4>
  1535. <div class="listingblock">
  1536. <div class="content">
  1537. <pre class="highlight"><code>typedef ... element_type;</code></pre>
  1538. </div>
  1539. </div>
  1540. <div class="paragraph">
  1541. <p><code>element_type</code> is <code>T</code> when <code>T</code> is not an array type, and <code>U</code> when <code>T</code> is <code>U[]</code> or <code>U[N]</code>.</p>
  1542. </div>
  1543. </div>
  1544. <div class="sect3">
  1545. <h4 id="shared_ptr_default_constructor">default constructor</h4>
  1546. <div class="listingblock">
  1547. <div class="content">
  1548. <pre class="highlight"><code>constexpr shared_ptr() noexcept;</code></pre>
  1549. </div>
  1550. </div>
  1551. <div class="listingblock">
  1552. <div class="content">
  1553. <pre class="highlight"><code>constexpr shared_ptr(std::nullptr_t) noexcept;</code></pre>
  1554. </div>
  1555. </div>
  1556. <div class="ulist none">
  1557. <ul class="none">
  1558. <li>
  1559. <p></p>
  1560. <div class="dlist">
  1561. <dl>
  1562. <dt class="hdlist1">Effects</dt>
  1563. <dd>
  1564. <p>Constructs an empty <code>shared_ptr</code>.</p>
  1565. </dd>
  1566. <dt class="hdlist1">Postconditions</dt>
  1567. <dd>
  1568. <p><code>use_count() == 0 &amp;&amp; get() == 0</code>.</p>
  1569. </dd>
  1570. </dl>
  1571. </div>
  1572. </li>
  1573. </ul>
  1574. </div>
  1575. </div>
  1576. <div class="sect3">
  1577. <h4 id="shared_ptr_pointer_constructor">pointer constructor</h4>
  1578. <div class="listingblock">
  1579. <div class="content">
  1580. <pre class="highlight"><code>template&lt;class Y&gt; explicit shared_ptr(Y * p);</code></pre>
  1581. </div>
  1582. </div>
  1583. <div class="ulist none">
  1584. <ul class="none">
  1585. <li>
  1586. <p></p>
  1587. <div class="dlist">
  1588. <dl>
  1589. <dt class="hdlist1">Requires</dt>
  1590. <dd>
  1591. <p><code>Y</code> must be a complete type. The expression <code>delete[] p</code>, when <code>T</code> is an array type, or <code>delete p</code>, when <code>T</code> is not an array type,
  1592. must be well-formed, well-defined, and not throw exceptions. When <code>T</code> is <code>U[N]</code>, <code>Y(*)[N]</code> must be convertible to <code>T*</code>; when <code>T</code> is <code>U[]</code>, <code>Y(*)[]</code>
  1593. must be convertible to <code>T*</code>; otherwise, <code>Y*</code> must be convertible to <code>T*</code>.</p>
  1594. </dd>
  1595. <dt class="hdlist1">Effects</dt>
  1596. <dd>
  1597. <p>When <code>T</code> is not an array type, constructs a <code>shared_ptr</code> that owns the pointer <code>p</code>. Otherwise, constructs a <code>shared_ptr</code> that owns <code>p</code> and
  1598. a deleter of an unspecified type that calls <code>delete[] p</code>.</p>
  1599. </dd>
  1600. <dt class="hdlist1">Postconditions</dt>
  1601. <dd>
  1602. <p><code>use_count() == 1 &amp;&amp; get() == p</code>. If <code>T</code> is not an array type and <code>p</code> is unambiguously convertible to <code>enable_shared_from_this&lt;V&gt;*</code>
  1603. for some <code>V</code>, <code>p-&gt;shared_from_this()</code> returns a copy of <code>*this</code>.</p>
  1604. </dd>
  1605. <dt class="hdlist1">Throws</dt>
  1606. <dd>
  1607. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  1608. </dd>
  1609. <dt class="hdlist1">Exception safety</dt>
  1610. <dd>
  1611. <p>If an exception is thrown, the constructor calls <code>delete[] p</code>, when <code>T</code> is an array type, or <code>delete p</code>, when <code>T</code> is not an array type.</p>
  1612. </dd>
  1613. </dl>
  1614. </div>
  1615. </li>
  1616. </ul>
  1617. </div>
  1618. <div class="admonitionblock note">
  1619. <table>
  1620. <tr>
  1621. <td class="icon">
  1622. <div class="title">Note</div>
  1623. </td>
  1624. <td class="content">
  1625. <code>p</code> must be a pointer to an object that was allocated via a C&#43;&#43; <code>new</code> expression or be 0. The postcondition that use count is 1 holds even if <code>p</code>
  1626. is 0; invoking <code>delete</code> on a pointer that has a value of 0 is harmless.
  1627. </td>
  1628. </tr>
  1629. </table>
  1630. </div>
  1631. <div class="admonitionblock note">
  1632. <table>
  1633. <tr>
  1634. <td class="icon">
  1635. <div class="title">Note</div>
  1636. </td>
  1637. <td class="content">
  1638. This constructor is a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete
  1639. with its original type, even when <code>T</code> does not have a virtual destructor, or is <code>void</code>.
  1640. </td>
  1641. </tr>
  1642. </table>
  1643. </div>
  1644. </div>
  1645. <div class="sect3">
  1646. <h4 id="shared_ptr_constructors_taking_a_deleter">constructors taking a deleter</h4>
  1647. <div class="listingblock">
  1648. <div class="content">
  1649. <pre class="highlight"><code>template&lt;class Y, class D&gt; shared_ptr(Y * p, D d);</code></pre>
  1650. </div>
  1651. </div>
  1652. <div class="listingblock">
  1653. <div class="content">
  1654. <pre class="highlight"><code>template&lt;class Y, class D, class A&gt; shared_ptr(Y * p, D d, A a);</code></pre>
  1655. </div>
  1656. </div>
  1657. <div class="listingblock">
  1658. <div class="content">
  1659. <pre class="highlight"><code>template&lt;class D&gt; shared_ptr(std::nullptr_t p, D d);</code></pre>
  1660. </div>
  1661. </div>
  1662. <div class="listingblock">
  1663. <div class="content">
  1664. <pre class="highlight"><code>template&lt;class D, class A&gt; shared_ptr(std::nullptr_t p, D d, A a);</code></pre>
  1665. </div>
  1666. </div>
  1667. <div class="ulist none">
  1668. <ul class="none">
  1669. <li>
  1670. <p></p>
  1671. <div class="dlist">
  1672. <dl>
  1673. <dt class="hdlist1">Requires</dt>
  1674. <dd>
  1675. <p><code>D</code> must be <code>CopyConstructible</code>. The copy constructor and destructor of <code>D</code> must not throw. The expression <code>d(p)</code> must be well-formed, well-defined,
  1676. and not throw exceptions. <code>A</code> must be an <code>Allocator</code>, as described in section Allocator Requirements [allocator.requirements] of the C&#43;&#43; Standard.
  1677. When <code>T</code> is <code>U[N]</code>, <code>Y(*)[N]</code> must be convertible to <code>T*</code>; when <code>T</code> is <code>U[]</code>, <code>Y(*)[]</code> must be convertible to <code>T*</code>; otherwise, <code>Y*</code> must be convertible to <code>T*</code>.</p>
  1678. </dd>
  1679. <dt class="hdlist1">Effects</dt>
  1680. <dd>
  1681. <p>Constructs a <code>shared_ptr</code> that owns the pointer <code>p</code> and the deleter <code>d</code>. The constructors taking an allocator a allocate memory using a copy of <code>a</code>.</p>
  1682. </dd>
  1683. <dt class="hdlist1">Postconditions</dt>
  1684. <dd>
  1685. <p><code>use_count() == 1 &amp;&amp; get() == p</code>. If <code>T</code> is not an array type and <code>p</code> is unambiguously convertible to <code>enable_shared_from_this&lt;V&gt;*</code> for some <code>V</code>,
  1686. <code>p-&gt;shared_from_this()</code> returns a copy of <code>*this</code>.</p>
  1687. </dd>
  1688. <dt class="hdlist1">Throws</dt>
  1689. <dd>
  1690. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  1691. </dd>
  1692. <dt class="hdlist1">Exception safety</dt>
  1693. <dd>
  1694. <p>If an exception is thrown, <code>d(p)</code> is called.</p>
  1695. </dd>
  1696. </dl>
  1697. </div>
  1698. </li>
  1699. </ul>
  1700. </div>
  1701. <div class="admonitionblock note">
  1702. <table>
  1703. <tr>
  1704. <td class="icon">
  1705. <div class="title">Note</div>
  1706. </td>
  1707. <td class="content">
  1708. When the the time comes to delete the object pointed to by <code>p</code>, the stored copy of <code>d</code> is invoked with the stored copy of <code>p</code> as an argument.
  1709. </td>
  1710. </tr>
  1711. </table>
  1712. </div>
  1713. <div class="admonitionblock note">
  1714. <table>
  1715. <tr>
  1716. <td class="icon">
  1717. <div class="title">Note</div>
  1718. </td>
  1719. <td class="content">
  1720. Custom deallocators allow a factory function returning a <code>shared_ptr</code> to insulate the user from its memory allocation strategy. Since the deallocator
  1721. is not part of the type, changing the allocation strategy does not break source or binary compatibility, and does not require a client recompilation. For example,
  1722. a "no-op" deallocator is useful when returning a <code>shared_ptr</code> to a statically allocated object, and other variations allow a <code>shared_ptr</code> to be used as a wrapper
  1723. for another smart pointer, easing interoperability.
  1724. </td>
  1725. </tr>
  1726. </table>
  1727. </div>
  1728. <div class="admonitionblock note">
  1729. <table>
  1730. <tr>
  1731. <td class="icon">
  1732. <div class="title">Note</div>
  1733. </td>
  1734. <td class="content">
  1735. The requirement that the copy constructor of <code>D</code> does not throw comes from the pass by value. If the copy constructor throws, the pointer would leak.
  1736. </td>
  1737. </tr>
  1738. </table>
  1739. </div>
  1740. </div>
  1741. <div class="sect3">
  1742. <h4 id="shared_ptr_copy_and_converting_constructors">copy and converting constructors</h4>
  1743. <div class="listingblock">
  1744. <div class="content">
  1745. <pre class="highlight"><code>shared_ptr(shared_ptr const &amp; r) noexcept;</code></pre>
  1746. </div>
  1747. </div>
  1748. <div class="listingblock">
  1749. <div class="content">
  1750. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  1751. </div>
  1752. </div>
  1753. <div class="ulist none">
  1754. <ul class="none">
  1755. <li>
  1756. <p></p>
  1757. <div class="dlist">
  1758. <dl>
  1759. <dt class="hdlist1">Requires</dt>
  1760. <dd>
  1761. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  1762. </dd>
  1763. <dt class="hdlist1">Effects</dt>
  1764. <dd>
  1765. <p>If <code>r</code> is empty, constructs an empty <code>shared_ptr</code>; otherwise, constructs a <code>shared_ptr</code> that shares ownership with <code>r</code>.</p>
  1766. </dd>
  1767. <dt class="hdlist1">Postconditions</dt>
  1768. <dd>
  1769. <p><code>get() == r.get() &amp;&amp; use_count() == r.use_count()</code>.</p>
  1770. </dd>
  1771. </dl>
  1772. </div>
  1773. </li>
  1774. </ul>
  1775. </div>
  1776. </div>
  1777. <div class="sect3">
  1778. <h4 id="shared_ptr_move_constructors">move constructors</h4>
  1779. <div class="listingblock">
  1780. <div class="content">
  1781. <pre class="highlight"><code>shared_ptr(shared_ptr &amp;&amp; r) noexcept;</code></pre>
  1782. </div>
  1783. </div>
  1784. <div class="listingblock">
  1785. <div class="content">
  1786. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;</code></pre>
  1787. </div>
  1788. </div>
  1789. <div class="ulist none">
  1790. <ul class="none">
  1791. <li>
  1792. <p></p>
  1793. <div class="dlist">
  1794. <dl>
  1795. <dt class="hdlist1">Requires</dt>
  1796. <dd>
  1797. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  1798. </dd>
  1799. <dt class="hdlist1">Effects</dt>
  1800. <dd>
  1801. <p>Move-constructs a <code>shared_ptr</code> from <code>r</code>.</p>
  1802. </dd>
  1803. <dt class="hdlist1">Postconditions</dt>
  1804. <dd>
  1805. <p><code>*this</code> contains the old value of <code>r</code>. <code>r</code> is empty and <code>r.get() == 0</code>.</p>
  1806. </dd>
  1807. </dl>
  1808. </div>
  1809. </li>
  1810. </ul>
  1811. </div>
  1812. </div>
  1813. <div class="sect3">
  1814. <h4 id="shared_ptr_aliasing_constructor">aliasing constructor</h4>
  1815. <div class="listingblock">
  1816. <div class="content">
  1817. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  1818. </div>
  1819. </div>
  1820. <div class="ulist none">
  1821. <ul class="none">
  1822. <li>
  1823. <p></p>
  1824. <div class="dlist">
  1825. <dl>
  1826. <dt class="hdlist1">Effects</dt>
  1827. <dd>
  1828. <p>Copy-constructs a <code>shared_ptr</code> from <code>r</code>, while storing <code>p</code> instead.</p>
  1829. </dd>
  1830. <dt class="hdlist1">Postconditions</dt>
  1831. <dd>
  1832. <p><code>get() == p &amp;&amp; use_count() == r.use_count()</code>.</p>
  1833. </dd>
  1834. </dl>
  1835. </div>
  1836. </li>
  1837. </ul>
  1838. </div>
  1839. </div>
  1840. <div class="sect3">
  1841. <h4 id="shared_ptr_aliasing_move_constructor">aliasing move constructor</h4>
  1842. <div class="listingblock">
  1843. <div class="content">
  1844. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;</code></pre>
  1845. </div>
  1846. </div>
  1847. <div class="ulist none">
  1848. <ul class="none">
  1849. <li>
  1850. <p></p>
  1851. <div class="dlist">
  1852. <dl>
  1853. <dt class="hdlist1">Effects</dt>
  1854. <dd>
  1855. <p>Move-constructs a <code>shared_ptr</code> from <code>r</code>, while storing <code>p</code> instead.</p>
  1856. </dd>
  1857. <dt class="hdlist1">Postconditions</dt>
  1858. <dd>
  1859. <p><code>get() == p</code> and <code>use_count()</code> equals the old count of <code>r</code>. <code>r</code> is empty and <code>r.get() == 0</code>.</p>
  1860. </dd>
  1861. </dl>
  1862. </div>
  1863. </li>
  1864. </ul>
  1865. </div>
  1866. </div>
  1867. <div class="sect3">
  1868. <h4 id="shared_ptr_weak_ptr_constructor">weak_ptr constructor</h4>
  1869. <div class="listingblock">
  1870. <div class="content">
  1871. <pre class="highlight"><code>template&lt;class Y&gt; explicit shared_ptr(weak_ptr&lt;Y&gt; const &amp; r);</code></pre>
  1872. </div>
  1873. </div>
  1874. <div class="ulist none">
  1875. <ul class="none">
  1876. <li>
  1877. <p></p>
  1878. <div class="dlist">
  1879. <dl>
  1880. <dt class="hdlist1">Requires</dt>
  1881. <dd>
  1882. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  1883. </dd>
  1884. <dt class="hdlist1">Effects</dt>
  1885. <dd>
  1886. <p>Constructs a <code>shared_ptr</code> that shares ownership with <code>r</code> and stores a copy of the pointer stored in <code>r</code>.</p>
  1887. </dd>
  1888. <dt class="hdlist1">Postconditions</dt>
  1889. <dd>
  1890. <p><code>use_count() == r.use_count()</code>.</p>
  1891. </dd>
  1892. <dt class="hdlist1">Throws</dt>
  1893. <dd>
  1894. <p><code>bad_weak_ptr</code> when <code>r.use_count() == 0</code>.</p>
  1895. </dd>
  1896. <dt class="hdlist1">Exception safety</dt>
  1897. <dd>
  1898. <p>If an exception is thrown, the constructor has no effect.</p>
  1899. </dd>
  1900. </dl>
  1901. </div>
  1902. </li>
  1903. </ul>
  1904. </div>
  1905. </div>
  1906. <div class="sect3">
  1907. <h4 id="shared_ptr_auto_ptr_constructors">auto_ptr constructors</h4>
  1908. <div class="listingblock">
  1909. <div class="content">
  1910. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(std::auto_ptr&lt;Y&gt; &amp; r);</code></pre>
  1911. </div>
  1912. </div>
  1913. <div class="listingblock">
  1914. <div class="content">
  1915. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr(std::auto_ptr&lt;Y&gt; &amp;&amp; r);</code></pre>
  1916. </div>
  1917. </div>
  1918. <div class="ulist none">
  1919. <ul class="none">
  1920. <li>
  1921. <p></p>
  1922. <div class="dlist">
  1923. <dl>
  1924. <dt class="hdlist1">Requires</dt>
  1925. <dd>
  1926. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  1927. </dd>
  1928. <dt class="hdlist1">Effects</dt>
  1929. <dd>
  1930. <p>Constructs a <code>shared_ptr</code>, as if by storing a copy of <code>r.release()</code>.</p>
  1931. </dd>
  1932. <dt class="hdlist1">Postconditions</dt>
  1933. <dd>
  1934. <p><code>use_count() == 1</code>.</p>
  1935. </dd>
  1936. <dt class="hdlist1">Throws</dt>
  1937. <dd>
  1938. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  1939. </dd>
  1940. <dt class="hdlist1">Exception safety</dt>
  1941. <dd>
  1942. <p>If an exception is thrown, the constructor has no effect.</p>
  1943. </dd>
  1944. </dl>
  1945. </div>
  1946. </li>
  1947. </ul>
  1948. </div>
  1949. </div>
  1950. <div class="sect3">
  1951. <h4 id="shared_ptr_unique_ptr_constructor">unique_ptr constructor</h4>
  1952. <div class="listingblock">
  1953. <div class="content">
  1954. <pre class="highlight"><code>template&lt;class Y, class D&gt; shared_ptr(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);</code></pre>
  1955. </div>
  1956. </div>
  1957. <div class="ulist none">
  1958. <ul class="none">
  1959. <li>
  1960. <p></p>
  1961. <div class="dlist">
  1962. <dl>
  1963. <dt class="hdlist1">Requires</dt>
  1964. <dd>
  1965. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  1966. </dd>
  1967. <dt class="hdlist1">Effects</dt>
  1968. <dd>
  1969. <div class="ulist">
  1970. <ul>
  1971. <li>
  1972. <p>When <code>r.get() == 0</code>, equivalent to <code>shared_ptr()</code>;</p>
  1973. </li>
  1974. <li>
  1975. <p>When <code>D</code> is not a reference type, equivalent to <code>shared_ptr(r.release(), r.get_deleter())</code>;</p>
  1976. </li>
  1977. <li>
  1978. <p>Otherwise, equivalent to <code>shared_ptr(r.release(), del)</code>, where <code>del</code> is a deleter that stores the reference <code>rd</code> returned
  1979. from <code>r.get_deleter()</code> and <code>del(p)</code> calls <code>rd(p)</code>.</p>
  1980. </li>
  1981. </ul>
  1982. </div>
  1983. </dd>
  1984. <dt class="hdlist1">Throws</dt>
  1985. <dd>
  1986. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  1987. </dd>
  1988. <dt class="hdlist1">Exception safety</dt>
  1989. <dd>
  1990. <p>If an exception is thrown, the constructor has no effect.</p>
  1991. </dd>
  1992. </dl>
  1993. </div>
  1994. </li>
  1995. </ul>
  1996. </div>
  1997. </div>
  1998. <div class="sect3">
  1999. <h4 id="shared_ptr_destructor">destructor</h4>
  2000. <div class="listingblock">
  2001. <div class="content">
  2002. <pre class="highlight"><code>~shared_ptr() noexcept;</code></pre>
  2003. </div>
  2004. </div>
  2005. <div class="ulist none">
  2006. <ul class="none">
  2007. <li>
  2008. <p></p>
  2009. <div class="dlist">
  2010. <dl>
  2011. <dt class="hdlist1">Effects</dt>
  2012. <dd>
  2013. <div class="ulist">
  2014. <ul>
  2015. <li>
  2016. <p>If <code>*this</code> is empty, or shares ownership with another <code>shared_ptr</code> instance (<code>use_count() &gt; 1</code>), there are no side effects.</p>
  2017. </li>
  2018. <li>
  2019. <p>Otherwise, if <code>*this</code> owns a pointer <code>p</code> and a deleter <code>d</code>, <code>d(p)</code> is called.</p>
  2020. </li>
  2021. <li>
  2022. <p>Otherwise, <code>*this</code> owns a pointer <code>p</code>, and <code>delete p</code> is called.</p>
  2023. </li>
  2024. </ul>
  2025. </div>
  2026. </dd>
  2027. </dl>
  2028. </div>
  2029. </li>
  2030. </ul>
  2031. </div>
  2032. </div>
  2033. <div class="sect3">
  2034. <h4 id="shared_ptr_assignment">assignment</h4>
  2035. <div class="listingblock">
  2036. <div class="content">
  2037. <pre class="highlight"><code>shared_ptr &amp; operator=(shared_ptr const &amp; r) noexcept;</code></pre>
  2038. </div>
  2039. </div>
  2040. <div class="listingblock">
  2041. <div class="content">
  2042. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr &amp; operator=(shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  2043. </div>
  2044. </div>
  2045. <div class="listingblock">
  2046. <div class="content">
  2047. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr &amp; operator=(std::auto_ptr&lt;Y&gt; &amp; r);</code></pre>
  2048. </div>
  2049. </div>
  2050. <div class="ulist none">
  2051. <ul class="none">
  2052. <li>
  2053. <p></p>
  2054. <div class="dlist">
  2055. <dl>
  2056. <dt class="hdlist1">Effects</dt>
  2057. <dd>
  2058. <p>Equivalent to <code>shared_ptr(r).swap(*this)</code>.</p>
  2059. </dd>
  2060. <dt class="hdlist1">Returns</dt>
  2061. <dd>
  2062. <p><code>*this</code>.</p>
  2063. </dd>
  2064. </dl>
  2065. </div>
  2066. </li>
  2067. </ul>
  2068. </div>
  2069. <div class="admonitionblock note">
  2070. <table>
  2071. <tr>
  2072. <td class="icon">
  2073. <div class="title">Note</div>
  2074. </td>
  2075. <td class="content">
  2076. The use count updates caused by the temporary object construction and destruction are not considered observable side effects,
  2077. and the implementation is free to meet the effects (and the implied guarantees) via different means, without creating a temporary.
  2078. </td>
  2079. </tr>
  2080. </table>
  2081. </div>
  2082. <div class="admonitionblock note">
  2083. <table>
  2084. <tr>
  2085. <td class="icon">
  2086. <div class="title">Note</div>
  2087. </td>
  2088. <td class="content">
  2089. <div class="paragraph">
  2090. <p>In particular, in the example:</p>
  2091. </div>
  2092. <div class="listingblock">
  2093. <div class="content">
  2094. <pre class="highlight"><code>shared_ptr&lt;int&gt; p(new int);
  2095. shared_ptr&lt;void&gt; q(p);
  2096. p = p;
  2097. q = p;</code></pre>
  2098. </div>
  2099. </div>
  2100. <div class="paragraph">
  2101. <p>both assignments may be no-ops.</p>
  2102. </div>
  2103. </td>
  2104. </tr>
  2105. </table>
  2106. </div>
  2107. <div class="listingblock">
  2108. <div class="content">
  2109. <pre class="highlight"><code>shared_ptr &amp; operator=(shared_ptr &amp;&amp; r) noexcept;</code></pre>
  2110. </div>
  2111. </div>
  2112. <div class="listingblock">
  2113. <div class="content">
  2114. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr &amp; operator=(shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;</code></pre>
  2115. </div>
  2116. </div>
  2117. <div class="listingblock">
  2118. <div class="content">
  2119. <pre class="highlight"><code>template&lt;class Y&gt; shared_ptr &amp; operator=(std::auto_ptr&lt;Y&gt; &amp;&amp; r);</code></pre>
  2120. </div>
  2121. </div>
  2122. <div class="listingblock">
  2123. <div class="content">
  2124. <pre class="highlight"><code>template&lt;class Y, class D&gt; shared_ptr &amp; operator=(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);</code></pre>
  2125. </div>
  2126. </div>
  2127. <div class="ulist none">
  2128. <ul class="none">
  2129. <li>
  2130. <p></p>
  2131. <div class="dlist">
  2132. <dl>
  2133. <dt class="hdlist1">Effects</dt>
  2134. <dd>
  2135. <p>Equivalent to <code>shared_ptr(std::move(r)).swap(*this)</code>.</p>
  2136. </dd>
  2137. <dt class="hdlist1">Returns</dt>
  2138. <dd>
  2139. <p><code>*this</code>.</p>
  2140. </dd>
  2141. </dl>
  2142. </div>
  2143. </li>
  2144. </ul>
  2145. </div>
  2146. <div class="listingblock">
  2147. <div class="content">
  2148. <pre class="highlight"><code>shared_ptr &amp; operator=(std::nullptr_t) noexcept;</code></pre>
  2149. </div>
  2150. </div>
  2151. <div class="ulist none">
  2152. <ul class="none">
  2153. <li>
  2154. <p></p>
  2155. <div class="dlist">
  2156. <dl>
  2157. <dt class="hdlist1">Effects</dt>
  2158. <dd>
  2159. <p>Equivalent to <code>shared_ptr().swap(*this)</code>.</p>
  2160. </dd>
  2161. <dt class="hdlist1">Returns</dt>
  2162. <dd>
  2163. <p><code>*this</code>.</p>
  2164. </dd>
  2165. </dl>
  2166. </div>
  2167. </li>
  2168. </ul>
  2169. </div>
  2170. </div>
  2171. <div class="sect3">
  2172. <h4 id="shared_ptr_reset">reset</h4>
  2173. <div class="listingblock">
  2174. <div class="content">
  2175. <pre class="highlight"><code>void reset() noexcept;</code></pre>
  2176. </div>
  2177. </div>
  2178. <div class="ulist none">
  2179. <ul class="none">
  2180. <li>
  2181. <p></p>
  2182. <div class="dlist">
  2183. <dl>
  2184. <dt class="hdlist1">Effects</dt>
  2185. <dd>
  2186. <p>Equivalent to <code>shared_ptr().swap(*this)</code>.</p>
  2187. </dd>
  2188. </dl>
  2189. </div>
  2190. </li>
  2191. </ul>
  2192. </div>
  2193. <div class="listingblock">
  2194. <div class="content">
  2195. <pre class="highlight"><code>template&lt;class Y&gt; void reset(Y * p);</code></pre>
  2196. </div>
  2197. </div>
  2198. <div class="ulist none">
  2199. <ul class="none">
  2200. <li>
  2201. <p></p>
  2202. <div class="dlist">
  2203. <dl>
  2204. <dt class="hdlist1">Effects</dt>
  2205. <dd>
  2206. <p>Equivalent to <code>shared_ptr(p).swap(*this)</code>.</p>
  2207. </dd>
  2208. </dl>
  2209. </div>
  2210. </li>
  2211. </ul>
  2212. </div>
  2213. <div class="listingblock">
  2214. <div class="content">
  2215. <pre class="highlight"><code>template&lt;class Y, class D&gt; void reset(Y * p, D d);</code></pre>
  2216. </div>
  2217. </div>
  2218. <div class="ulist none">
  2219. <ul class="none">
  2220. <li>
  2221. <p></p>
  2222. <div class="dlist">
  2223. <dl>
  2224. <dt class="hdlist1">Effects</dt>
  2225. <dd>
  2226. <p>Equivalent to <code>shared_ptr(p, d).swap(*this)</code>.</p>
  2227. </dd>
  2228. </dl>
  2229. </div>
  2230. </li>
  2231. </ul>
  2232. </div>
  2233. <div class="listingblock">
  2234. <div class="content">
  2235. <pre class="highlight"><code>template&lt;class Y, class D, class A&gt; void reset(Y * p, D d, A a);</code></pre>
  2236. </div>
  2237. </div>
  2238. <div class="ulist none">
  2239. <ul class="none">
  2240. <li>
  2241. <p></p>
  2242. <div class="dlist">
  2243. <dl>
  2244. <dt class="hdlist1">Effects</dt>
  2245. <dd>
  2246. <p>Equivalent to <code>shared_ptr(p, d, a).swap(*this)</code>.</p>
  2247. </dd>
  2248. </dl>
  2249. </div>
  2250. </li>
  2251. </ul>
  2252. </div>
  2253. <div class="listingblock">
  2254. <div class="content">
  2255. <pre class="highlight"><code>template&lt;class Y&gt; void reset(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  2256. </div>
  2257. </div>
  2258. <div class="ulist none">
  2259. <ul class="none">
  2260. <li>
  2261. <p></p>
  2262. <div class="dlist">
  2263. <dl>
  2264. <dt class="hdlist1">Effects</dt>
  2265. <dd>
  2266. <p>Equivalent to <code>shared_ptr(r, p).swap(*this)</code>.</p>
  2267. </dd>
  2268. </dl>
  2269. </div>
  2270. </li>
  2271. </ul>
  2272. </div>
  2273. <div class="listingblock">
  2274. <div class="content">
  2275. <pre class="highlight"><code>template&lt;class Y&gt; void reset(shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;</code></pre>
  2276. </div>
  2277. </div>
  2278. <div class="ulist none">
  2279. <ul class="none">
  2280. <li>
  2281. <p></p>
  2282. <div class="dlist">
  2283. <dl>
  2284. <dt class="hdlist1">Effects</dt>
  2285. <dd>
  2286. <p>Equivalent to <code>shared_ptr(std::move(r), p).swap(*this)</code>.</p>
  2287. </dd>
  2288. </dl>
  2289. </div>
  2290. </li>
  2291. </ul>
  2292. </div>
  2293. </div>
  2294. <div class="sect3">
  2295. <h4 id="shared_ptr_indirection">indirection</h4>
  2296. <div class="listingblock">
  2297. <div class="content">
  2298. <pre class="highlight"><code>T &amp; operator*() const noexcept;</code></pre>
  2299. </div>
  2300. </div>
  2301. <div class="ulist none">
  2302. <ul class="none">
  2303. <li>
  2304. <p></p>
  2305. <div class="dlist">
  2306. <dl>
  2307. <dt class="hdlist1">Requires</dt>
  2308. <dd>
  2309. <p><code>T</code> should not be an array type. The stored pointer must not be 0.</p>
  2310. </dd>
  2311. <dt class="hdlist1">Returns</dt>
  2312. <dd>
  2313. <p><code>*get()</code>.</p>
  2314. </dd>
  2315. </dl>
  2316. </div>
  2317. </li>
  2318. </ul>
  2319. </div>
  2320. <div class="listingblock">
  2321. <div class="content">
  2322. <pre class="highlight"><code>T * operator-&gt;() const noexcept;</code></pre>
  2323. </div>
  2324. </div>
  2325. <div class="ulist none">
  2326. <ul class="none">
  2327. <li>
  2328. <p></p>
  2329. <div class="dlist">
  2330. <dl>
  2331. <dt class="hdlist1">Requires</dt>
  2332. <dd>
  2333. <p><code>T</code> should not be an array type. The stored pointer must not be 0.</p>
  2334. </dd>
  2335. <dt class="hdlist1">Returns</dt>
  2336. <dd>
  2337. <p><code>get()</code>.</p>
  2338. </dd>
  2339. </dl>
  2340. </div>
  2341. </li>
  2342. </ul>
  2343. </div>
  2344. <div class="listingblock">
  2345. <div class="content">
  2346. <pre class="highlight"><code>element_type &amp; operator[](std::ptrdiff_t i) const noexcept;</code></pre>
  2347. </div>
  2348. </div>
  2349. <div class="ulist none">
  2350. <ul class="none">
  2351. <li>
  2352. <p></p>
  2353. <div class="dlist">
  2354. <dl>
  2355. <dt class="hdlist1">Requires</dt>
  2356. <dd>
  2357. <p><code>T</code> should be an array type. The stored pointer must not be 0. <code>i &gt;= 0</code>. If <code>T</code> is <code>U[N]</code>, <code>i &lt; N</code>.</p>
  2358. </dd>
  2359. <dt class="hdlist1">Returns</dt>
  2360. <dd>
  2361. <p><code>get()[i]</code>.</p>
  2362. </dd>
  2363. </dl>
  2364. </div>
  2365. </li>
  2366. </ul>
  2367. </div>
  2368. </div>
  2369. <div class="sect3">
  2370. <h4 id="shared_ptr_get">get</h4>
  2371. <div class="listingblock">
  2372. <div class="content">
  2373. <pre class="highlight"><code>element_type * get() const noexcept;</code></pre>
  2374. </div>
  2375. </div>
  2376. <div class="ulist none">
  2377. <ul class="none">
  2378. <li>
  2379. <p></p>
  2380. <div class="dlist">
  2381. <dl>
  2382. <dt class="hdlist1">Returns</dt>
  2383. <dd>
  2384. <p>The stored pointer.</p>
  2385. </dd>
  2386. </dl>
  2387. </div>
  2388. </li>
  2389. </ul>
  2390. </div>
  2391. </div>
  2392. <div class="sect3">
  2393. <h4 id="shared_ptr_unique">unique</h4>
  2394. <div class="listingblock">
  2395. <div class="content">
  2396. <pre class="highlight"><code>bool unique() const noexcept;</code></pre>
  2397. </div>
  2398. </div>
  2399. <div class="ulist none">
  2400. <ul class="none">
  2401. <li>
  2402. <p></p>
  2403. <div class="dlist">
  2404. <dl>
  2405. <dt class="hdlist1">Returns</dt>
  2406. <dd>
  2407. <p><code>use_count() == 1</code>.</p>
  2408. </dd>
  2409. </dl>
  2410. </div>
  2411. </li>
  2412. </ul>
  2413. </div>
  2414. </div>
  2415. <div class="sect3">
  2416. <h4 id="shared_ptr_use_count">use_count</h4>
  2417. <div class="listingblock">
  2418. <div class="content">
  2419. <pre class="highlight"><code>long use_count() const noexcept;</code></pre>
  2420. </div>
  2421. </div>
  2422. <div class="ulist none">
  2423. <ul class="none">
  2424. <li>
  2425. <p></p>
  2426. <div class="dlist">
  2427. <dl>
  2428. <dt class="hdlist1">Returns</dt>
  2429. <dd>
  2430. <p>The number of <code>shared_ptr</code> objects, <code>*this</code> included, that share ownership with <code>*this</code>, or 0 when <code>*this</code> is empty.</p>
  2431. </dd>
  2432. </dl>
  2433. </div>
  2434. </li>
  2435. </ul>
  2436. </div>
  2437. </div>
  2438. <div class="sect3">
  2439. <h4 id="shared_ptr_conversions">conversions</h4>
  2440. <div class="listingblock">
  2441. <div class="content">
  2442. <pre class="highlight"><code>explicit operator bool() const noexcept;</code></pre>
  2443. </div>
  2444. </div>
  2445. <div class="ulist none">
  2446. <ul class="none">
  2447. <li>
  2448. <p></p>
  2449. <div class="dlist">
  2450. <dl>
  2451. <dt class="hdlist1">Returns</dt>
  2452. <dd>
  2453. <p><code>get() != 0</code>.</p>
  2454. </dd>
  2455. </dl>
  2456. </div>
  2457. </li>
  2458. </ul>
  2459. </div>
  2460. <div class="admonitionblock note">
  2461. <table>
  2462. <tr>
  2463. <td class="icon">
  2464. <div class="title">Note</div>
  2465. </td>
  2466. <td class="content">
  2467. This conversion operator allows <code>shared_ptr</code> objects to be used in boolean contexts, like <code>if(p &amp;&amp; p-&gt;valid()) {}</code>.
  2468. </td>
  2469. </tr>
  2470. </table>
  2471. </div>
  2472. <div class="admonitionblock note">
  2473. <table>
  2474. <tr>
  2475. <td class="icon">
  2476. <div class="title">Note</div>
  2477. </td>
  2478. <td class="content">
  2479. The conversion to <code>bool</code> is not merely syntactic sugar. It allows <code>shared_ptr</code> variables to be declared in conditions when using
  2480. <code>dynamic_pointer_cast</code> or <code>weak_ptr::lock</code>.
  2481. </td>
  2482. </tr>
  2483. </table>
  2484. </div>
  2485. <div class="admonitionblock note">
  2486. <table>
  2487. <tr>
  2488. <td class="icon">
  2489. <div class="title">Note</div>
  2490. </td>
  2491. <td class="content">
  2492. On C++03 compilers, the return value is of an unspecified type.
  2493. </td>
  2494. </tr>
  2495. </table>
  2496. </div>
  2497. </div>
  2498. <div class="sect3">
  2499. <h4 id="shared_ptr_swap">swap</h4>
  2500. <div class="listingblock">
  2501. <div class="content">
  2502. <pre class="highlight"><code>void swap(shared_ptr &amp; b) noexcept;</code></pre>
  2503. </div>
  2504. </div>
  2505. <div class="ulist none">
  2506. <ul class="none">
  2507. <li>
  2508. <p></p>
  2509. <div class="dlist">
  2510. <dl>
  2511. <dt class="hdlist1">Effects</dt>
  2512. <dd>
  2513. <p>Exchanges the contents of the two smart pointers.</p>
  2514. </dd>
  2515. </dl>
  2516. </div>
  2517. </li>
  2518. </ul>
  2519. </div>
  2520. </div>
  2521. <div class="sect3">
  2522. <h4 id="shared_ptr_owner_before">owner_before</h4>
  2523. <div class="listingblock">
  2524. <div class="content">
  2525. <pre class="highlight"><code>template&lt;class Y&gt; bool owner_before(shared_ptr&lt;Y&gt; const &amp; rhs) const noexcept;</code></pre>
  2526. </div>
  2527. </div>
  2528. <div class="listingblock">
  2529. <div class="content">
  2530. <pre class="highlight"><code>template&lt;class Y&gt; bool owner_before(weak_ptr&lt;Y&gt; const &amp; rhs) const noexcept;</code></pre>
  2531. </div>
  2532. </div>
  2533. <div class="ulist none">
  2534. <ul class="none">
  2535. <li>
  2536. <p></p>
  2537. <div class="dlist">
  2538. <dl>
  2539. <dt class="hdlist1">Effects</dt>
  2540. <dd>
  2541. <p>See the description of <code>operator&lt;</code>.</p>
  2542. </dd>
  2543. </dl>
  2544. </div>
  2545. </li>
  2546. </ul>
  2547. </div>
  2548. </div>
  2549. </div>
  2550. <div class="sect2">
  2551. <h3 id="shared_ptr_free_functions">Free Functions</h3>
  2552. <div class="sect3">
  2553. <h4 id="shared_ptr_comparison">comparison</h4>
  2554. <div class="listingblock">
  2555. <div class="content">
  2556. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2557. bool operator==(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  2558. </div>
  2559. </div>
  2560. <div class="ulist none">
  2561. <ul class="none">
  2562. <li>
  2563. <p></p>
  2564. <div class="dlist">
  2565. <dl>
  2566. <dt class="hdlist1">Returns</dt>
  2567. <dd>
  2568. <p><code>a.get() == b.get()</code>.</p>
  2569. </dd>
  2570. </dl>
  2571. </div>
  2572. </li>
  2573. </ul>
  2574. </div>
  2575. <div class="listingblock">
  2576. <div class="content">
  2577. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2578. bool operator!=(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  2579. </div>
  2580. </div>
  2581. <div class="ulist none">
  2582. <ul class="none">
  2583. <li>
  2584. <p></p>
  2585. <div class="dlist">
  2586. <dl>
  2587. <dt class="hdlist1">Returns</dt>
  2588. <dd>
  2589. <p><code>a.get() != b.get()</code>.</p>
  2590. </dd>
  2591. </dl>
  2592. </div>
  2593. </li>
  2594. </ul>
  2595. </div>
  2596. <div class="listingblock">
  2597. <div class="content">
  2598. <pre class="highlight"><code>template&lt;class T&gt; bool operator==(shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;</code></pre>
  2599. </div>
  2600. </div>
  2601. <div class="listingblock">
  2602. <div class="content">
  2603. <pre class="highlight"><code>template&lt;class T&gt; bool operator==(std::nullptr_t, shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  2604. </div>
  2605. </div>
  2606. <div class="ulist none">
  2607. <ul class="none">
  2608. <li>
  2609. <p></p>
  2610. <div class="dlist">
  2611. <dl>
  2612. <dt class="hdlist1">Returns</dt>
  2613. <dd>
  2614. <p><code>p.get() == 0</code>.</p>
  2615. </dd>
  2616. </dl>
  2617. </div>
  2618. </li>
  2619. </ul>
  2620. </div>
  2621. <div class="listingblock">
  2622. <div class="content">
  2623. <pre class="highlight"><code>template&lt;class T&gt; bool operator!=(shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;</code></pre>
  2624. </div>
  2625. </div>
  2626. <div class="listingblock">
  2627. <div class="content">
  2628. <pre class="highlight"><code>template&lt;class T&gt; bool operator!=(std::nullptr_t, shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  2629. </div>
  2630. </div>
  2631. <div class="ulist none">
  2632. <ul class="none">
  2633. <li>
  2634. <p></p>
  2635. <div class="dlist">
  2636. <dl>
  2637. <dt class="hdlist1">Returns</dt>
  2638. <dd>
  2639. <p><code>p.get() != 0</code>.</p>
  2640. </dd>
  2641. </dl>
  2642. </div>
  2643. </li>
  2644. </ul>
  2645. </div>
  2646. <div class="listingblock">
  2647. <div class="content">
  2648. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2649. bool operator&lt;(shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  2650. </div>
  2651. </div>
  2652. <div class="ulist none">
  2653. <ul class="none">
  2654. <li>
  2655. <p></p>
  2656. <div class="dlist">
  2657. <dl>
  2658. <dt class="hdlist1">Returns</dt>
  2659. <dd>
  2660. <p>An unspecified value such that</p>
  2661. <div class="ulist">
  2662. <ul>
  2663. <li>
  2664. <p><code>operator&lt;</code> is a strict weak ordering as described in section [lib.alg.sorting] of the C&#43;&#43; standard;</p>
  2665. </li>
  2666. <li>
  2667. <p>under the equivalence relation defined by <code>operator&lt;</code>, <code>!(a &lt; b) &amp;&amp; !(b &lt; a)</code>, two <code>shared_ptr</code> instances
  2668. are equivalent if and only if they share ownership or are both empty.</p>
  2669. </li>
  2670. </ul>
  2671. </div>
  2672. </dd>
  2673. </dl>
  2674. </div>
  2675. </li>
  2676. </ul>
  2677. </div>
  2678. <div class="admonitionblock note">
  2679. <table>
  2680. <tr>
  2681. <td class="icon">
  2682. <div class="title">Note</div>
  2683. </td>
  2684. <td class="content">
  2685. Allows <code>shared_ptr</code> objects to be used as keys in associative containers.
  2686. </td>
  2687. </tr>
  2688. </table>
  2689. </div>
  2690. <div class="admonitionblock note">
  2691. <table>
  2692. <tr>
  2693. <td class="icon">
  2694. <div class="title">Note</div>
  2695. </td>
  2696. <td class="content">
  2697. The rest of the comparison operators are omitted by design.
  2698. </td>
  2699. </tr>
  2700. </table>
  2701. </div>
  2702. </div>
  2703. <div class="sect3">
  2704. <h4 id="shared_ptr_swap_2">swap</h4>
  2705. <div class="listingblock">
  2706. <div class="content">
  2707. <pre class="highlight"><code>template&lt;class T&gt; void swap(shared_ptr&lt;T&gt; &amp; a, shared_ptr&lt;T&gt; &amp; b) noexcept;</code></pre>
  2708. </div>
  2709. </div>
  2710. <div class="ulist none">
  2711. <ul class="none">
  2712. <li>
  2713. <p></p>
  2714. <div class="dlist">
  2715. <dl>
  2716. <dt class="hdlist1">Effects</dt>
  2717. <dd>
  2718. <p>Equivalent to <code>a.swap(b)</code>.</p>
  2719. </dd>
  2720. </dl>
  2721. </div>
  2722. </li>
  2723. </ul>
  2724. </div>
  2725. </div>
  2726. <div class="sect3">
  2727. <h4 id="shared_ptr_get_pointer">get_pointer</h4>
  2728. <div class="listingblock">
  2729. <div class="content">
  2730. <pre class="highlight"><code>template&lt;class T&gt;
  2731. typename shared_ptr&lt;T&gt;::element_type *
  2732. get_pointer(shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  2733. </div>
  2734. </div>
  2735. <div class="ulist none">
  2736. <ul class="none">
  2737. <li>
  2738. <p></p>
  2739. <div class="dlist">
  2740. <dl>
  2741. <dt class="hdlist1">Returns</dt>
  2742. <dd>
  2743. <p><code>p.get()</code>.</p>
  2744. </dd>
  2745. </dl>
  2746. </div>
  2747. </li>
  2748. </ul>
  2749. </div>
  2750. <div class="admonitionblock note">
  2751. <table>
  2752. <tr>
  2753. <td class="icon">
  2754. <div class="title">Note</div>
  2755. </td>
  2756. <td class="content">
  2757. Provided as an aid to generic programming. Used by <code>mem_fn</code>.
  2758. </td>
  2759. </tr>
  2760. </table>
  2761. </div>
  2762. </div>
  2763. <div class="sect3">
  2764. <h4 id="shared_ptr_static_pointer_cast">static_pointer_cast</h4>
  2765. <div class="listingblock">
  2766. <div class="content">
  2767. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2768. shared_ptr&lt;T&gt; static_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  2769. </div>
  2770. </div>
  2771. <div class="ulist none">
  2772. <ul class="none">
  2773. <li>
  2774. <p></p>
  2775. <div class="dlist">
  2776. <dl>
  2777. <dt class="hdlist1">Requires</dt>
  2778. <dd>
  2779. <p>The expression <code>static_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  2780. </dd>
  2781. <dt class="hdlist1">Returns</dt>
  2782. <dd>
  2783. <p><code>shared_ptr&lt;T&gt;( r, static_cast&lt;typename shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  2784. </dd>
  2785. </dl>
  2786. </div>
  2787. </li>
  2788. </ul>
  2789. </div>
  2790. <div class="admonitionblock caution">
  2791. <table>
  2792. <tr>
  2793. <td class="icon">
  2794. <div class="title">Caution</div>
  2795. </td>
  2796. <td class="content">
  2797. The seemingly equivalent expression <code>shared_ptr&lt;T&gt;(static_cast&lt;T*&gt;(r.get()))</code> will eventually
  2798. result in undefined behavior, attempting to delete the same object twice.
  2799. </td>
  2800. </tr>
  2801. </table>
  2802. </div>
  2803. </div>
  2804. <div class="sect3">
  2805. <h4 id="shared_ptr_const_pointer_cast">const_pointer_cast</h4>
  2806. <div class="listingblock">
  2807. <div class="content">
  2808. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2809. shared_ptr&lt;T&gt; const_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  2810. </div>
  2811. </div>
  2812. <div class="ulist none">
  2813. <ul class="none">
  2814. <li>
  2815. <p></p>
  2816. <div class="dlist">
  2817. <dl>
  2818. <dt class="hdlist1">Requires</dt>
  2819. <dd>
  2820. <p>The expression <code>const_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  2821. </dd>
  2822. <dt class="hdlist1">Returns</dt>
  2823. <dd>
  2824. <p><code>shared_ptr&lt;T&gt;( r, const_cast&lt;typename shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  2825. </dd>
  2826. </dl>
  2827. </div>
  2828. </li>
  2829. </ul>
  2830. </div>
  2831. </div>
  2832. <div class="sect3">
  2833. <h4 id="shared_ptr_dynamic_pointer_cast">dynamic_pointer_cast</h4>
  2834. <div class="listingblock">
  2835. <div class="content">
  2836. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2837. shared_ptr&lt;T&gt; dynamic_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  2838. </div>
  2839. </div>
  2840. <div class="ulist none">
  2841. <ul class="none">
  2842. <li>
  2843. <p></p>
  2844. <div class="dlist">
  2845. <dl>
  2846. <dt class="hdlist1">Requires</dt>
  2847. <dd>
  2848. <p>The expression <code>dynamic_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  2849. </dd>
  2850. <dt class="hdlist1">Returns</dt>
  2851. <dd>
  2852. <div class="ulist">
  2853. <ul>
  2854. <li>
  2855. <p>When <code>dynamic_cast&lt;typename shared_ptr&lt;T&gt;::element_type*&gt;(r.get())</code> returns a nonzero value <code>p</code>, <code>shared_ptr&lt;T&gt;(r, p)</code>;</p>
  2856. </li>
  2857. <li>
  2858. <p>Otherwise, <code>shared_ptr&lt;T&gt;()</code>.</p>
  2859. </li>
  2860. </ul>
  2861. </div>
  2862. </dd>
  2863. </dl>
  2864. </div>
  2865. </li>
  2866. </ul>
  2867. </div>
  2868. </div>
  2869. <div class="sect3">
  2870. <h4 id="shared_ptr_reinterpret_pointer_cast">reinterpret_pointer_cast</h4>
  2871. <div class="listingblock">
  2872. <div class="content">
  2873. <pre class="highlight"><code>template&lt;class T, class U&gt;
  2874. shared_ptr&lt;T&gt; reinterpret_pointer_cast(shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  2875. </div>
  2876. </div>
  2877. <div class="ulist none">
  2878. <ul class="none">
  2879. <li>
  2880. <p></p>
  2881. <div class="dlist">
  2882. <dl>
  2883. <dt class="hdlist1">Requires</dt>
  2884. <dd>
  2885. <p>The expression <code>reinterpret_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  2886. </dd>
  2887. <dt class="hdlist1">Returns</dt>
  2888. <dd>
  2889. <p><code>shared_ptr&lt;T&gt;( r, reinterpret_cast&lt;typename shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  2890. </dd>
  2891. </dl>
  2892. </div>
  2893. </li>
  2894. </ul>
  2895. </div>
  2896. </div>
  2897. <div class="sect3">
  2898. <h4 id="shared_ptr_operator">operator&lt;&lt;</h4>
  2899. <div class="listingblock">
  2900. <div class="content">
  2901. <pre class="highlight"><code>template&lt;class E, class T, class Y&gt;
  2902. std::basic_ostream&lt;E, T&gt; &amp;
  2903. operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os, shared_ptr&lt;Y&gt; const &amp; p);</code></pre>
  2904. </div>
  2905. </div>
  2906. <div class="ulist none">
  2907. <ul class="none">
  2908. <li>
  2909. <p></p>
  2910. <div class="dlist">
  2911. <dl>
  2912. <dt class="hdlist1">Effects</dt>
  2913. <dd>
  2914. <p><code>os &lt;&lt; p.get();</code>.</p>
  2915. </dd>
  2916. <dt class="hdlist1">Returns</dt>
  2917. <dd>
  2918. <p><code>os</code>.</p>
  2919. </dd>
  2920. </dl>
  2921. </div>
  2922. </li>
  2923. </ul>
  2924. </div>
  2925. </div>
  2926. <div class="sect3">
  2927. <h4 id="shared_ptr_get_deleter">get_deleter</h4>
  2928. <div class="listingblock">
  2929. <div class="content">
  2930. <pre class="highlight"><code>template&lt;class D, class T&gt;
  2931. D * get_deleter(shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  2932. </div>
  2933. </div>
  2934. <div class="ulist none">
  2935. <ul class="none">
  2936. <li>
  2937. <p></p>
  2938. <div class="dlist">
  2939. <dl>
  2940. <dt class="hdlist1">Returns</dt>
  2941. <dd>
  2942. <p>If <code>*this</code> owns a deleter <code>d</code> of type (cv-unqualified) <code>D</code>, returns <code>&amp;d</code>; otherwise returns 0.</p>
  2943. </dd>
  2944. </dl>
  2945. </div>
  2946. </li>
  2947. </ul>
  2948. </div>
  2949. </div>
  2950. <div class="sect3">
  2951. <h4 id="shared_ptr_atomic_access">Atomic Access</h4>
  2952. <div class="admonitionblock note">
  2953. <table>
  2954. <tr>
  2955. <td class="icon">
  2956. <div class="title">Note</div>
  2957. </td>
  2958. <td class="content">
  2959. The function in this section are atomic with respect to the first <code>shared_ptr</code> argument,
  2960. identified by <code>*p</code>. Concurrent access to the same <code>shared_ptr</code> instance is not a data race, if
  2961. done exclusively by the functions in this section.
  2962. </td>
  2963. </tr>
  2964. </table>
  2965. </div>
  2966. <div class="listingblock">
  2967. <div class="content">
  2968. <pre class="highlight"><code>template&lt;class T&gt; bool atomic_is_lock_free( shared_ptr&lt;T&gt; const * p ) noexcept;</code></pre>
  2969. </div>
  2970. </div>
  2971. <div class="ulist none">
  2972. <ul class="none">
  2973. <li>
  2974. <p></p>
  2975. <div class="dlist">
  2976. <dl>
  2977. <dt class="hdlist1">Returns</dt>
  2978. <dd>
  2979. <p><code>false</code>.</p>
  2980. </dd>
  2981. </dl>
  2982. </div>
  2983. </li>
  2984. </ul>
  2985. </div>
  2986. <div class="admonitionblock note">
  2987. <table>
  2988. <tr>
  2989. <td class="icon">
  2990. <div class="title">Note</div>
  2991. </td>
  2992. <td class="content">
  2993. This implementation is not lock-free.
  2994. </td>
  2995. </tr>
  2996. </table>
  2997. </div>
  2998. <div class="listingblock">
  2999. <div class="content">
  3000. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T&gt; atomic_load( shared_ptr&lt;T&gt; const * p ) noexcept;</code></pre>
  3001. </div>
  3002. </div>
  3003. <div class="listingblock">
  3004. <div class="content">
  3005. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T&gt; atomic_load_explicit( shared_ptr&lt;T&gt; const * p, int ) noexcept;</code></pre>
  3006. </div>
  3007. </div>
  3008. <div class="ulist none">
  3009. <ul class="none">
  3010. <li>
  3011. <p></p>
  3012. <div class="dlist">
  3013. <dl>
  3014. <dt class="hdlist1">Returns</dt>
  3015. <dd>
  3016. <p><code>*p</code>.</p>
  3017. </dd>
  3018. </dl>
  3019. </div>
  3020. </li>
  3021. </ul>
  3022. </div>
  3023. <div class="admonitionblock note">
  3024. <table>
  3025. <tr>
  3026. <td class="icon">
  3027. <div class="title">Note</div>
  3028. </td>
  3029. <td class="content">
  3030. The <code>int</code> argument is the <code>memory_order</code>, but this implementation does not use it, as it&#8217;s lock-based
  3031. and therefore always sequentially consistent.
  3032. </td>
  3033. </tr>
  3034. </table>
  3035. </div>
  3036. <div class="listingblock">
  3037. <div class="content">
  3038. <pre class="highlight"><code>template&lt;class T&gt;
  3039. void atomic_store( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r ) noexcept;</code></pre>
  3040. </div>
  3041. </div>
  3042. <div class="listingblock">
  3043. <div class="content">
  3044. <pre class="highlight"><code>template&lt;class T&gt;
  3045. void atomic_store_explicit( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r, int ) noexcept;</code></pre>
  3046. </div>
  3047. </div>
  3048. <div class="ulist none">
  3049. <ul class="none">
  3050. <li>
  3051. <p></p>
  3052. <div class="dlist">
  3053. <dl>
  3054. <dt class="hdlist1">Effects</dt>
  3055. <dd>
  3056. <p><code>p-&gt;swap(r)</code>.</p>
  3057. </dd>
  3058. </dl>
  3059. </div>
  3060. </li>
  3061. </ul>
  3062. </div>
  3063. <div class="listingblock">
  3064. <div class="content">
  3065. <pre class="highlight"><code>template&lt;class T&gt;
  3066. shared_ptr&lt;T&gt; atomic_exchange( shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r ) noexcept;</code></pre>
  3067. </div>
  3068. </div>
  3069. <div class="listingblock">
  3070. <div class="content">
  3071. <pre class="highlight"><code>template&lt;class T&gt;
  3072. shared_ptr&lt;T&gt; atomic_exchange_explicit(
  3073. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; r, int ) noexcept;</code></pre>
  3074. </div>
  3075. </div>
  3076. <div class="ulist none">
  3077. <ul class="none">
  3078. <li>
  3079. <p></p>
  3080. <div class="dlist">
  3081. <dl>
  3082. <dt class="hdlist1">Effects</dt>
  3083. <dd>
  3084. <p><code>p-&gt;swap(r)</code>.</p>
  3085. </dd>
  3086. <dt class="hdlist1">Returns</dt>
  3087. <dd>
  3088. <p>The old value of <code>*p</code>.</p>
  3089. </dd>
  3090. </dl>
  3091. </div>
  3092. </li>
  3093. </ul>
  3094. </div>
  3095. <div class="listingblock">
  3096. <div class="content">
  3097. <pre class="highlight"><code>template&lt;class T&gt;
  3098. bool atomic_compare_exchange(
  3099. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; * v, shared_ptr&lt;T&gt; w ) noexcept;</code></pre>
  3100. </div>
  3101. </div>
  3102. <div class="listingblock">
  3103. <div class="content">
  3104. <pre class="highlight"><code>template&lt;class T&gt;
  3105. bool atomic_compare_exchange_explicit(
  3106. shared_ptr&lt;T&gt; * p, shared_ptr&lt;T&gt; * v, shared_ptr&lt;T&gt; w, int, int ) noexcept;</code></pre>
  3107. </div>
  3108. </div>
  3109. <div class="ulist none">
  3110. <ul class="none">
  3111. <li>
  3112. <p></p>
  3113. <div class="dlist">
  3114. <dl>
  3115. <dt class="hdlist1">Effects</dt>
  3116. <dd>
  3117. <p>If <code>*p</code> is equivalent to <code>*v</code>, assigns <code>w</code> to <code>*p</code>, otherwise assigns <code>*p</code> to <code>*v</code>.</p>
  3118. </dd>
  3119. <dt class="hdlist1">Returns</dt>
  3120. <dd>
  3121. <p><code>true</code> if <code>*p</code> was equivalent to <code>*v</code>, <code>false</code> otherwise.</p>
  3122. </dd>
  3123. <dt class="hdlist1">Remarks</dt>
  3124. <dd>
  3125. <p>Two <code>shared_ptr</code> instances are equivalent if they store the same pointer value and <em>share ownership</em>.</p>
  3126. </dd>
  3127. </dl>
  3128. </div>
  3129. </li>
  3130. </ul>
  3131. </div>
  3132. </div>
  3133. </div>
  3134. <div class="sect2">
  3135. <h3 id="shared_ptr_example">Example</h3>
  3136. <div class="paragraph">
  3137. <p>See <a href="../../example/shared_ptr_example.cpp">shared_ptr_example.cpp</a> for a complete example program. The program builds a
  3138. <code>std::vector</code> and <code>std::set</code> of <code>shared_ptr</code> objects.</p>
  3139. </div>
  3140. <div class="paragraph">
  3141. <p>Note that after the containers have been populated, some of the <code>shared_ptr</code> objects will have a use count of 1 rather than
  3142. a use count of 2, since the set is a <code>std::set</code> rather than a <code>std::multiset</code>, and thus does not contain duplicate entries.
  3143. Furthermore, the use count may be even higher at various times while <code>push_back</code> and <code>insert</code> container operations are performed.
  3144. More complicated yet, the container operations may throw exceptions under a variety of circumstances. Getting the memory management
  3145. and exception handling in this example right without a smart pointer would be a nightmare.</p>
  3146. </div>
  3147. </div>
  3148. <div class="sect2">
  3149. <h3 id="shared_ptr_handlebody_idiom">Handle/Body Idiom</h3>
  3150. <div class="paragraph">
  3151. <p>One common usage of <code>shared_ptr</code> is to implement a handle/body (also called pimpl) idiom which avoids exposing the body (implementation)
  3152. in the header file.</p>
  3153. </div>
  3154. <div class="paragraph">
  3155. <p>The <a href="../../example/shared_ptr_example2_test.cpp">shared_ptr_example2_test.cpp</a> sample program includes a header file,
  3156. <a href="../../example/shared_ptr_example2.hpp">shared_ptr_example2.hpp</a>, which uses a <code>shared_ptr</code> to an incomplete type to hide the implementation.
  3157. The instantiation of member functions which require a complete type occurs in the <a href="../../example/shared_ptr_example2.cpp">shared_ptr_example2.cpp</a>
  3158. implementation file. Note that there is no need for an explicit destructor. Unlike <code>~scoped_ptr</code>, <code>~shared_ptr</code> does not require that <code>T</code> be a complete type.</p>
  3159. </div>
  3160. </div>
  3161. <div class="sect2">
  3162. <h3 id="shared_ptr_thread_safety">Thread Safety</h3>
  3163. <div class="paragraph">
  3164. <p><code>shared_ptr</code> objects offer the same level of thread safety as built-in types. A <code>shared_ptr</code> instance can be "read" (accessed using only const operations)
  3165. simultaneously by multiple threads. Different <code>shared_ptr</code> instances can be "written to" (accessed using mutable operations such as <code>operator=</code> or <code>reset</code>)
  3166. simultaneously by multiple threads (even when these instances are copies, and share the same reference count underneath.)</p>
  3167. </div>
  3168. <div class="paragraph">
  3169. <p>Any other simultaneous accesses result in undefined behavior.</p>
  3170. </div>
  3171. <div class="paragraph">
  3172. <p>Examples:</p>
  3173. </div>
  3174. <div class="listingblock">
  3175. <div class="content">
  3176. <pre class="highlight"><code>shared_ptr&lt;int&gt; p(new int(42));</code></pre>
  3177. </div>
  3178. </div>
  3179. <div class="listingblock">
  3180. <div class="title">Code Example 4. Reading a <code>shared_ptr</code> from two threads</div>
  3181. <div class="content">
  3182. <pre class="highlight"><code>// thread A
  3183. shared_ptr&lt;int&gt; p2(p); // reads p
  3184. // thread B
  3185. shared_ptr&lt;int&gt; p3(p); // OK, multiple reads are safe</code></pre>
  3186. </div>
  3187. </div>
  3188. <div class="listingblock">
  3189. <div class="title">Code Example 5. Writing different <code>shared_ptr</code> instances from two threads</div>
  3190. <div class="content">
  3191. <pre class="highlight"><code>// thread A
  3192. p.reset(new int(1912)); // writes p
  3193. // thread B
  3194. p2.reset(); // OK, writes p2</code></pre>
  3195. </div>
  3196. </div>
  3197. <div class="listingblock">
  3198. <div class="title">Code Example 6. Reading and writing a <code>shared_ptr</code> from two threads</div>
  3199. <div class="content">
  3200. <pre class="highlight"><code>// thread A
  3201. p = p3; // reads p3, writes p
  3202. // thread B
  3203. p3.reset(); // writes p3; undefined, simultaneous read/write</code></pre>
  3204. </div>
  3205. </div>
  3206. <div class="listingblock">
  3207. <div class="title">Code Example 7. Reading and destroying a <code>shared_ptr</code> from two threads</div>
  3208. <div class="content">
  3209. <pre class="highlight"><code>// thread A
  3210. p3 = p2; // reads p2, writes p3
  3211. // thread B
  3212. // p2 goes out of scope: undefined, the destructor is considered a "write access"</code></pre>
  3213. </div>
  3214. </div>
  3215. <div class="listingblock">
  3216. <div class="title">Code Example 8. Writing a <code>shared_ptr</code> from two threads</div>
  3217. <div class="content">
  3218. <pre class="highlight"><code>// thread A
  3219. p3.reset(new int(1));
  3220. // thread B
  3221. p3.reset(new int(2)); // undefined, multiple writes</code></pre>
  3222. </div>
  3223. </div>
  3224. <div class="paragraph">
  3225. <p>Starting with Boost release 1.33.0, <code>shared_ptr</code> uses a lock-free implementation on most common platforms.</p>
  3226. </div>
  3227. <div class="paragraph">
  3228. <p>If your program is single-threaded and does not link to any libraries that might have used <code>shared_ptr</code> in its default configuration,
  3229. you can <code>#define</code> the macro <code>BOOST_SP_DISABLE_THREADS</code> on a project-wide basis to switch to ordinary non-atomic reference count updates.</p>
  3230. </div>
  3231. <div class="paragraph">
  3232. <p>(Defining <code>BOOST_SP_DISABLE_THREADS</code> in some, but not all, translation units is technically a violation of the One Definition Rule and
  3233. undefined behavior. Nevertheless, the implementation attempts to do its best to accommodate the request to use non-atomic updates in those
  3234. translation units. No guarantees, though.)</p>
  3235. </div>
  3236. <div class="paragraph">
  3237. <p>You can define the macro <code>BOOST_SP_USE_PTHREADS</code> to turn off the lock-free platform-specific implementation and fall back to the generic
  3238. <code>pthread_mutex_t</code>-based code.</p>
  3239. </div>
  3240. </div>
  3241. <div class="sect2">
  3242. <h3 id="shared_ptr_frequently_asked_questions">Frequently Asked Questions</h3>
  3243. <div class="qlist qanda">
  3244. <ol>
  3245. <li>
  3246. <p><em>There are several variations of shared pointers, with different tradeoffs; why does the smart pointer library supply only a single implementation? It would be useful to be able to experiment with each type so as to find the most suitable for the job at hand?</em></p>
  3247. <p>An important goal of <code>shared_ptr</code> is to provide a standard shared-ownership pointer. Having a single pointer type is important for stable
  3248. library interfaces, since different shared pointers typically cannot interoperate, i.e. a reference counted pointer (used by library A)
  3249. cannot share ownership with a linked pointer (used by library B.)</p>
  3250. </li>
  3251. <li>
  3252. <p><em>Why doesn&#8217;t shared_ptr have template parameters supplying traits or policies to allow extensive user customization?</em></p>
  3253. <p>Parameterization discourages users. The <code>shared_ptr</code> template is carefully crafted to meet common needs without extensive parameterization.</p>
  3254. </li>
  3255. <li>
  3256. <p><em>I am not convinced. Default parameters can be used where appropriate to hide the complexity. Again, why not policies?</em></p>
  3257. <p>Template parameters affect the type. See the answer to the first question above.</p>
  3258. </li>
  3259. <li>
  3260. <p><em>Why doesn&#8217;t <code>shared_ptr</code> use a linked list implementation?</em></p>
  3261. <p>A linked list implementation does not offer enough advantages to offset the added cost of an extra pointer. In addition, it is expensive to
  3262. make a linked list implementation thread safe.</p>
  3263. </li>
  3264. <li>
  3265. <p><em>Why doesn&#8217;t <code>shared_ptr</code> (or any of the other Boost smart pointers) supply an automatic conversion to T*?</em></p>
  3266. <p>Automatic conversion is believed to be too error prone.</p>
  3267. </li>
  3268. <li>
  3269. <p><em>Why does <code>shared_ptr</code> supply <code>use_count()</code>?</em></p>
  3270. <p>As an aid to writing test cases and debugging displays. One of the progenitors had <code>use_count()</code>, and it was useful in tracking down bugs in
  3271. a complex project that turned out to have cyclic-dependencies.</p>
  3272. </li>
  3273. <li>
  3274. <p><em>Why doesn&#8217;t <code>shared_ptr</code> specify complexity requirements?</em></p>
  3275. <p>Because complexity requirements limit implementors and complicate the specification without apparent benefit to <code>shared_ptr</code> users. For example,
  3276. error-checking implementations might become non-conforming if they had to meet stringent complexity requirements.</p>
  3277. </li>
  3278. <li>
  3279. <p><em>Why doesn&#8217;t <code>shared_ptr</code> provide a <code>release()</code> function?</em></p>
  3280. <p><code>shared_ptr</code> cannot give away ownership unless it&#8217;s <code>unique()</code> because the other copy will still destroy the object.</p>
  3281. <div class="paragraph">
  3282. <p>Consider:</p>
  3283. </div>
  3284. <div class="listingblock">
  3285. <div class="content">
  3286. <pre class="highlight"><code>shared_ptr&lt;int&gt; a(new int);
  3287. shared_ptr&lt;int&gt; b(a); // a.use_count() == b.use_count() == 2
  3288. int * p = a.release();
  3289. // Who owns p now? b will still call delete on it in its destructor.</code></pre>
  3290. </div>
  3291. </div>
  3292. <div class="paragraph">
  3293. <p>Furthermore, the pointer returned by <code>release()</code> would be difficult to deallocate reliably, as the source <code>shared_ptr</code> could have been created with a
  3294. custom deleter, or may have pointed to an object of a different type.</p>
  3295. </div>
  3296. </li>
  3297. <li>
  3298. <p><em>Why is <code>operator-&gt;()</code> const, but its return value is a non-const pointer to the element type?</em></p>
  3299. <p>Shallow copy pointers, including raw pointers, typically don&#8217;t propagate constness. It makes little sense for them to do so, as you can always obtain a
  3300. non-const pointer from a const one and then proceed to modify the object through it. <code>shared_ptr</code> is "as close to raw pointers as possible but no closer".</p>
  3301. </li>
  3302. </ol>
  3303. </div>
  3304. </div>
  3305. </div>
  3306. </div>
  3307. <div class="sect1">
  3308. <h2 id="weak_ptr">weak_ptr: Non-owning Observer</h2>
  3309. <div class="sectionbody">
  3310. <div class="sect2">
  3311. <h3 id="weak_ptr_description">Description</h3>
  3312. <div class="paragraph">
  3313. <p>The <code>weak_ptr</code> class template stores a "weak reference" to an object that&#8217;s already managed by a <code>shared_ptr</code>.
  3314. To access the object, a <code>weak_ptr</code> can be converted to a <code>shared_ptr</code> using the <code>shared_ptr</code> constructor taking
  3315. <code>weak_ptr</code>, or the <code>weak_ptr</code> member function <code>lock</code>. When the last <code>shared_ptr</code> to the object goes away and the
  3316. object is deleted, the attempt to obtain a <code>shared_ptr</code> from the <code>weak_ptr</code> instances that refer to the deleted
  3317. object will fail: the constructor will throw an exception of type <code>boost::bad_weak_ptr</code>, and <code>weak_ptr::lock</code> will
  3318. return an empty <code>shared_ptr</code>.</p>
  3319. </div>
  3320. <div class="paragraph">
  3321. <p>Every <code>weak_ptr</code> meets the <code>CopyConstructible</code> and <code>Assignable</code> requirements of the C&#43;&#43; Standard Library, and so
  3322. can be used in standard library containers. Comparison operators are supplied so that <code>weak_ptr</code> works with the standard
  3323. library&#8217;s associative containers.</p>
  3324. </div>
  3325. <div class="paragraph">
  3326. <p><code>weak_ptr</code> operations never throw exceptions.</p>
  3327. </div>
  3328. <div class="paragraph">
  3329. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to.</p>
  3330. </div>
  3331. <div class="paragraph">
  3332. <p>Compared to <code>shared_ptr</code>, <code>weak_ptr</code> provides a very limited subset of operations since accessing its stored pointer is
  3333. often dangerous in multithreaded programs, and sometimes unsafe even within a single thread (that is, it may invoke undefined
  3334. behavior.) Pretend for a moment that <code>weak_ptr</code> had a get member function that returned a raw pointer, and consider this innocent
  3335. piece of code:</p>
  3336. </div>
  3337. <div class="listingblock">
  3338. <div class="content">
  3339. <pre class="highlight"><code>shared_ptr&lt;int&gt; p(new int(5));
  3340. weak_ptr&lt;int&gt; q(p);
  3341. // some time later
  3342. if(int * r = q.get())
  3343. {
  3344. // use *r
  3345. }</code></pre>
  3346. </div>
  3347. </div>
  3348. <div class="paragraph">
  3349. <p>Imagine that after the <code>if</code>, but immediately before <code>r</code> is used, another thread executes the statement <code>p.reset()</code>. Now <code>r</code> is a dangling pointer.</p>
  3350. </div>
  3351. <div class="paragraph">
  3352. <p>The solution to this problem is to create a temporary <code>shared_ptr</code> from <code>q</code>:</p>
  3353. </div>
  3354. <div class="listingblock">
  3355. <div class="content">
  3356. <pre class="highlight"><code>shared_ptr&lt;int&gt; p(new int(5));
  3357. weak_ptr&lt;int&gt; q(p);
  3358. // some time later
  3359. if(shared_ptr&lt;int&gt; r = q.lock())
  3360. {
  3361. // use *r
  3362. }</code></pre>
  3363. </div>
  3364. </div>
  3365. <div class="paragraph">
  3366. <p>Now <code>r</code> holds a reference to the object that was pointed by <code>q</code>. Even if <code>p.reset()</code> is executed in another thread, the object will stay alive until
  3367. <code>r</code> goes out of scope or is reset. By obtaining a <code>shared_ptr</code> to the object, we have effectively locked it against destruction.</p>
  3368. </div>
  3369. </div>
  3370. <div class="sect2">
  3371. <h3 id="weak_ptr_synopsis">Synopsis</h3>
  3372. <div class="paragraph">
  3373. <p><code>weak_ptr</code> is defined in <code>&lt;boost/smart_ptr/weak_ptr.hpp&gt;</code>.</p>
  3374. </div>
  3375. <div class="listingblock">
  3376. <div class="content">
  3377. <pre class="highlight"><code>namespace boost {
  3378. template&lt;class T&gt; class weak_ptr {
  3379. public:
  3380. typedef /*see below*/ element_type;
  3381. weak_ptr() noexcept;
  3382. template&lt;class Y&gt; weak_ptr(shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  3383. weak_ptr(weak_ptr const &amp; r) noexcept;
  3384. template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; const &amp; r) noexcept;
  3385. weak_ptr(weak_ptr &amp;&amp; r) noexcept;
  3386. template&lt;class Y&gt; weak_ptr(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  3387. template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  3388. template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;
  3389. ~weak_ptr() noexcept;
  3390. weak_ptr &amp; operator=(weak_ptr const &amp; r) noexcept;
  3391. weak_ptr &amp; operator=(weak_ptr &amp;&amp; r) noexcept;
  3392. template&lt;class Y&gt; weak_ptr &amp; operator=(weak_ptr&lt;Y&gt; const &amp; r) noexcept;
  3393. template&lt;class Y&gt; weak_ptr &amp; operator=(shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  3394. long use_count() const noexcept;
  3395. bool expired() const noexcept;
  3396. bool empty() const noexcept;
  3397. shared_ptr&lt;T&gt; lock() const noexcept;
  3398. void reset() noexcept;
  3399. void swap(weak_ptr&lt;T&gt; &amp; b) noexcept;
  3400. template&lt;class Y&gt; bool owner_before( weak_ptr&lt;Y&gt; const &amp; r ) const noexcept;
  3401. template&lt;class Y&gt; bool owner_before( shared_ptr&lt;Y&gt; const &amp; r ) const noexcept;
  3402. };
  3403. template&lt;class T, class U&gt;
  3404. bool operator&lt;(weak_ptr&lt;T&gt; const &amp; a, weak_ptr&lt;U&gt; const &amp; b) noexcept;
  3405. template&lt;class T&gt; void swap(weak_ptr&lt;T&gt; &amp; a, weak_ptr&lt;T&gt; &amp; b) noexcept;
  3406. }</code></pre>
  3407. </div>
  3408. </div>
  3409. </div>
  3410. <div class="sect2">
  3411. <h3 id="weak_ptr_members">Members</h3>
  3412. <div class="sect3">
  3413. <h4 id="weak_ptr_element_type">element_type</h4>
  3414. <div class="listingblock">
  3415. <div class="content">
  3416. <pre class="highlight"><code>typedef ... element_type;</code></pre>
  3417. </div>
  3418. </div>
  3419. <div class="paragraph">
  3420. <p><code>element_type</code> is <code>T</code> when <code>T</code> is not an array type, and <code>U</code> when <code>T</code> is <code>U[]</code> or <code>U[N]</code>.</p>
  3421. </div>
  3422. </div>
  3423. <div class="sect3">
  3424. <h4 id="weak_ptr_constructors">constructors</h4>
  3425. <div class="listingblock">
  3426. <div class="content">
  3427. <pre class="highlight"><code>weak_ptr() noexcept;</code></pre>
  3428. </div>
  3429. </div>
  3430. <div class="ulist none">
  3431. <ul class="none">
  3432. <li>
  3433. <p></p>
  3434. <div class="dlist">
  3435. <dl>
  3436. <dt class="hdlist1">Effects</dt>
  3437. <dd>
  3438. <p>Constructs an empty <code>weak_ptr</code>.</p>
  3439. </dd>
  3440. <dt class="hdlist1">Postconditions</dt>
  3441. <dd>
  3442. <p><code>use_count() == 0</code>.</p>
  3443. </dd>
  3444. </dl>
  3445. </div>
  3446. </li>
  3447. </ul>
  3448. </div>
  3449. <div class="listingblock">
  3450. <div class="content">
  3451. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr(shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  3452. </div>
  3453. </div>
  3454. <div class="listingblock">
  3455. <div class="content">
  3456. <pre class="highlight"><code>weak_ptr(weak_ptr const &amp; r) noexcept;</code></pre>
  3457. </div>
  3458. </div>
  3459. <div class="listingblock">
  3460. <div class="content">
  3461. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  3462. </div>
  3463. </div>
  3464. <div class="ulist none">
  3465. <ul class="none">
  3466. <li>
  3467. <p></p>
  3468. <div class="dlist">
  3469. <dl>
  3470. <dt class="hdlist1">Effects</dt>
  3471. <dd>
  3472. <p>If <code>r</code> is empty, constructs an empty <code>weak_ptr</code>; otherwise, constructs a <code>weak_ptr</code> that shares ownership with <code>r</code> as if by storing a copy of the pointer stored in <code>r</code>.</p>
  3473. </dd>
  3474. <dt class="hdlist1">Postconditions</dt>
  3475. <dd>
  3476. <p><code>use_count() == r.use_count()</code>.</p>
  3477. </dd>
  3478. </dl>
  3479. </div>
  3480. </li>
  3481. </ul>
  3482. </div>
  3483. <div class="listingblock">
  3484. <div class="content">
  3485. <pre class="highlight"><code>weak_ptr(weak_ptr &amp;&amp; r) noexcept;</code></pre>
  3486. </div>
  3487. </div>
  3488. <div class="ulist none">
  3489. <ul class="none">
  3490. <li>
  3491. <p></p>
  3492. <div class="dlist">
  3493. <dl>
  3494. <dt class="hdlist1">Effects</dt>
  3495. <dd>
  3496. <p>Constructs a <code>weak_ptr</code> that has the value <code>r</code> held.</p>
  3497. </dd>
  3498. <dt class="hdlist1">Postconditions</dt>
  3499. <dd>
  3500. <p><code>r</code> is empty.</p>
  3501. </dd>
  3502. </dl>
  3503. </div>
  3504. </li>
  3505. </ul>
  3506. </div>
  3507. </div>
  3508. <div class="sect3">
  3509. <h4 id="weak_ptr_aliasing_constructors">aliasing constructors</h4>
  3510. <div class="listingblock">
  3511. <div class="content">
  3512. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr(shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  3513. </div>
  3514. </div>
  3515. <div class="listingblock">
  3516. <div class="content">
  3517. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  3518. </div>
  3519. </div>
  3520. <div class="listingblock">
  3521. <div class="content">
  3522. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr(weak_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;</code></pre>
  3523. </div>
  3524. </div>
  3525. <div class="dlist">
  3526. <dl>
  3527. <dt class="hdlist1">Effects</dt>
  3528. <dd>
  3529. <p>Constructs a <code>weak_ptr</code> from <code>r</code> as if by using the corresponding converting/copy/move constructor, but stores <code>p</code> instead.</p>
  3530. </dd>
  3531. <dt class="hdlist1">Postconditions</dt>
  3532. <dd>
  3533. <p><code>use_count() == r.use_count()</code>. When <code>!expired()</code>, <code>shared_ptr&lt;T&gt;(*this).get() == p</code>.</p>
  3534. </dd>
  3535. </dl>
  3536. </div>
  3537. <div class="admonitionblock note">
  3538. <table>
  3539. <tr>
  3540. <td class="icon">
  3541. <div class="title">Note</div>
  3542. </td>
  3543. <td class="content">
  3544. These constructors are an extension, not present in <code>std::weak_ptr</code>.
  3545. </td>
  3546. </tr>
  3547. </table>
  3548. </div>
  3549. </div>
  3550. <div class="sect3">
  3551. <h4 id="weak_ptr_destructor">destructor</h4>
  3552. <div class="listingblock">
  3553. <div class="content">
  3554. <pre class="highlight"><code>~weak_ptr() noexcept;</code></pre>
  3555. </div>
  3556. </div>
  3557. <div class="ulist none">
  3558. <ul class="none">
  3559. <li>
  3560. <p></p>
  3561. <div class="dlist">
  3562. <dl>
  3563. <dt class="hdlist1">Effects</dt>
  3564. <dd>
  3565. <p>Destroys this <code>weak_ptr</code> but has no effect on the object its stored pointer points to.</p>
  3566. </dd>
  3567. </dl>
  3568. </div>
  3569. </li>
  3570. </ul>
  3571. </div>
  3572. </div>
  3573. <div class="sect3">
  3574. <h4 id="weak_ptr_assignment">assignment</h4>
  3575. <div class="listingblock">
  3576. <div class="content">
  3577. <pre class="highlight"><code>weak_ptr &amp; operator=(weak_ptr const &amp; r) noexcept;</code></pre>
  3578. </div>
  3579. </div>
  3580. <div class="listingblock">
  3581. <div class="content">
  3582. <pre class="highlight"><code>weak_ptr &amp; operator=(weak_ptr &amp;&amp; r) noexcept;</code></pre>
  3583. </div>
  3584. </div>
  3585. <div class="listingblock">
  3586. <div class="content">
  3587. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr &amp; operator=(weak_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  3588. </div>
  3589. </div>
  3590. <div class="listingblock">
  3591. <div class="content">
  3592. <pre class="highlight"><code>template&lt;class Y&gt; weak_ptr &amp; operator=(shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  3593. </div>
  3594. </div>
  3595. <div class="ulist none">
  3596. <ul class="none">
  3597. <li>
  3598. <p></p>
  3599. <div class="dlist">
  3600. <dl>
  3601. <dt class="hdlist1">Effects</dt>
  3602. <dd>
  3603. <p>Equivalent to <code>weak_ptr(r).swap(*this)</code>.</p>
  3604. </dd>
  3605. </dl>
  3606. </div>
  3607. </li>
  3608. </ul>
  3609. </div>
  3610. <div class="admonitionblock note">
  3611. <table>
  3612. <tr>
  3613. <td class="icon">
  3614. <div class="title">Note</div>
  3615. </td>
  3616. <td class="content">
  3617. The implementation is free to meet the effects (and the implied guarantees) via different means, without creating a temporary.
  3618. </td>
  3619. </tr>
  3620. </table>
  3621. </div>
  3622. </div>
  3623. <div class="sect3">
  3624. <h4 id="weak_ptr_use_count">use_count</h4>
  3625. <div class="listingblock">
  3626. <div class="content">
  3627. <pre class="highlight"><code>long use_count() const noexcept;</code></pre>
  3628. </div>
  3629. </div>
  3630. <div class="ulist none">
  3631. <ul class="none">
  3632. <li>
  3633. <p></p>
  3634. <div class="dlist">
  3635. <dl>
  3636. <dt class="hdlist1">Returns</dt>
  3637. <dd>
  3638. <p>0 if <code>*this</code> is empty; otherwise, the number of <code>shared_ptr</code> objects that share ownership with <code>*this</code>.</p>
  3639. </dd>
  3640. </dl>
  3641. </div>
  3642. </li>
  3643. </ul>
  3644. </div>
  3645. </div>
  3646. <div class="sect3">
  3647. <h4 id="weak_ptr_expired">expired</h4>
  3648. <div class="listingblock">
  3649. <div class="content">
  3650. <pre class="highlight"><code>bool expired() const noexcept;</code></pre>
  3651. </div>
  3652. </div>
  3653. <div class="ulist none">
  3654. <ul class="none">
  3655. <li>
  3656. <p></p>
  3657. <div class="dlist">
  3658. <dl>
  3659. <dt class="hdlist1">Returns</dt>
  3660. <dd>
  3661. <p><code>use_count() == 0</code>.</p>
  3662. </dd>
  3663. </dl>
  3664. </div>
  3665. </li>
  3666. </ul>
  3667. </div>
  3668. </div>
  3669. <div class="sect3">
  3670. <h4 id="weak_ptr_empty">empty</h4>
  3671. <div class="listingblock">
  3672. <div class="content">
  3673. <pre class="highlight"><code>bool empty() const noexcept;</code></pre>
  3674. </div>
  3675. </div>
  3676. <div class="ulist none">
  3677. <ul class="none">
  3678. <li>
  3679. <p></p>
  3680. <div class="dlist">
  3681. <dl>
  3682. <dt class="hdlist1">Returns</dt>
  3683. <dd>
  3684. <p><code>true</code> when <code>*this</code> is empty, <code>false</code> otherwise.</p>
  3685. </dd>
  3686. </dl>
  3687. </div>
  3688. </li>
  3689. </ul>
  3690. </div>
  3691. <div class="admonitionblock note">
  3692. <table>
  3693. <tr>
  3694. <td class="icon">
  3695. <div class="title">Note</div>
  3696. </td>
  3697. <td class="content">
  3698. This function is an extension, not present in <code>std::weak_ptr</code>.
  3699. </td>
  3700. </tr>
  3701. </table>
  3702. </div>
  3703. </div>
  3704. <div class="sect3">
  3705. <h4 id="weak_ptr_lock">lock</h4>
  3706. <div class="listingblock">
  3707. <div class="content">
  3708. <pre class="highlight"><code>shared_ptr&lt;T&gt; lock() const noexcept;</code></pre>
  3709. </div>
  3710. </div>
  3711. <div class="ulist none">
  3712. <ul class="none">
  3713. <li>
  3714. <p></p>
  3715. <div class="dlist">
  3716. <dl>
  3717. <dt class="hdlist1">Returns</dt>
  3718. <dd>
  3719. <p><code>expired()? shared_ptr&lt;T&gt;(): shared_ptr&lt;T&gt;(*this)</code>.</p>
  3720. </dd>
  3721. </dl>
  3722. </div>
  3723. </li>
  3724. </ul>
  3725. </div>
  3726. </div>
  3727. <div class="sect3">
  3728. <h4 id="weak_ptr_reset">reset</h4>
  3729. <div class="listingblock">
  3730. <div class="content">
  3731. <pre class="highlight"><code>void reset() noexcept;</code></pre>
  3732. </div>
  3733. </div>
  3734. <div class="ulist none">
  3735. <ul class="none">
  3736. <li>
  3737. <p></p>
  3738. <div class="dlist">
  3739. <dl>
  3740. <dt class="hdlist1">Effects</dt>
  3741. <dd>
  3742. <p>Equivalent to <code>weak_ptr().swap(*this)</code>.</p>
  3743. </dd>
  3744. </dl>
  3745. </div>
  3746. </li>
  3747. </ul>
  3748. </div>
  3749. </div>
  3750. <div class="sect3">
  3751. <h4 id="weak_ptr_swap">swap</h4>
  3752. <div class="listingblock">
  3753. <div class="content">
  3754. <pre class="highlight"><code>void swap(weak_ptr &amp; b) noexcept;</code></pre>
  3755. </div>
  3756. </div>
  3757. <div class="ulist none">
  3758. <ul class="none">
  3759. <li>
  3760. <p></p>
  3761. <div class="dlist">
  3762. <dl>
  3763. <dt class="hdlist1">Effects</dt>
  3764. <dd>
  3765. <p>Exchanges the contents of the two smart pointers.</p>
  3766. </dd>
  3767. </dl>
  3768. </div>
  3769. </li>
  3770. </ul>
  3771. </div>
  3772. <div class="listingblock">
  3773. <div class="content">
  3774. <pre class="highlight"><code>template&lt;class Y&gt; bool owner_before( weak_ptr&lt;Y&gt; const &amp; r ) const noexcept;</code></pre>
  3775. </div>
  3776. </div>
  3777. <div class="listingblock">
  3778. <div class="content">
  3779. <pre class="highlight"><code>template&lt;class Y&gt; bool owner_before( shared_ptr&lt;Y&gt; const &amp; r ) const noexcept;</code></pre>
  3780. </div>
  3781. </div>
  3782. <div class="ulist none">
  3783. <ul class="none">
  3784. <li>
  3785. <p></p>
  3786. <div class="dlist">
  3787. <dl>
  3788. <dt class="hdlist1">Returns</dt>
  3789. <dd>
  3790. <p>See the description of <code>operator&lt;</code>.</p>
  3791. </dd>
  3792. </dl>
  3793. </div>
  3794. </li>
  3795. </ul>
  3796. </div>
  3797. </div>
  3798. </div>
  3799. <div class="sect2">
  3800. <h3 id="weak_ptr_free_functions">Free Functions</h3>
  3801. <div class="sect3">
  3802. <h4 id="weak_ptr_comparison">comparison</h4>
  3803. <div class="listingblock">
  3804. <div class="content">
  3805. <pre class="highlight"><code>template&lt;class T, class U&gt;
  3806. bool operator&lt;(weak_ptr&lt;T&gt; const &amp; a, weak_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  3807. </div>
  3808. </div>
  3809. <div class="ulist none">
  3810. <ul class="none">
  3811. <li>
  3812. <p></p>
  3813. <div class="dlist">
  3814. <dl>
  3815. <dt class="hdlist1">Returns</dt>
  3816. <dd>
  3817. <p>An unspecified value such that</p>
  3818. <div class="ulist">
  3819. <ul>
  3820. <li>
  3821. <p><code>operator&lt;</code> is a strict weak ordering as described in section [lib.alg.sorting] of the C&#43;&#43; standard;</p>
  3822. </li>
  3823. <li>
  3824. <p>under the equivalence relation defined by <code>operator&lt;</code>, <code>!(a &lt; b) &amp;&amp; !(b &lt; a)</code>, two <code>weak_ptr</code> instances
  3825. are equivalent if and only if they share ownership or are both empty.</p>
  3826. </li>
  3827. </ul>
  3828. </div>
  3829. </dd>
  3830. </dl>
  3831. </div>
  3832. </li>
  3833. </ul>
  3834. </div>
  3835. <div class="admonitionblock note">
  3836. <table>
  3837. <tr>
  3838. <td class="icon">
  3839. <div class="title">Note</div>
  3840. </td>
  3841. <td class="content">
  3842. Allows <code>weak_ptr</code> objects to be used as keys in associative containers.
  3843. </td>
  3844. </tr>
  3845. </table>
  3846. </div>
  3847. </div>
  3848. <div class="sect3">
  3849. <h4 id="weak_ptr_swap_2">swap</h4>
  3850. <div class="listingblock">
  3851. <div class="content">
  3852. <pre class="highlight"><code>template&lt;class T&gt; void swap(weak_ptr&lt;T&gt; &amp; a, weak_ptr&lt;T&gt; &amp; b) noexcept;</code></pre>
  3853. </div>
  3854. </div>
  3855. <div class="ulist none">
  3856. <ul class="none">
  3857. <li>
  3858. <p></p>
  3859. <div class="dlist">
  3860. <dl>
  3861. <dt class="hdlist1">Effects</dt>
  3862. <dd>
  3863. <p>Equivalent to <code>a.swap(b)</code>.</p>
  3864. </dd>
  3865. </dl>
  3866. </div>
  3867. </li>
  3868. </ul>
  3869. </div>
  3870. </div>
  3871. </div>
  3872. <div class="sect2">
  3873. <h3 id="weak_ptr_frequently_asked_questions">Frequently Asked Questions</h3>
  3874. <div class="qlist qanda">
  3875. <ol>
  3876. <li>
  3877. <p><em>Can an object create a weak_ptr to itself in its constructor?</em></p>
  3878. <p>No. A <code>weak_ptr</code> can only be created from a <code>shared_ptr</code>, and at object construction time no
  3879. <code>shared_ptr</code> to the object exists yet. Even if you could create a temporary <code>shared_ptr</code> to <code>this</code>,
  3880. it would go out of scope at the end of the constructor, and all <code>weak_ptr</code> instances would instantly expire.</p>
  3881. <div class="paragraph">
  3882. <p>The solution is to make the constructor private, and supply a factory function that returns a <code>shared_ptr</code>:</p>
  3883. </div>
  3884. <div class="listingblock">
  3885. <div class="content">
  3886. <pre class="highlight"><code>class X
  3887. {
  3888. private:
  3889. X();
  3890. public:
  3891. static shared_ptr&lt;X&gt; create()
  3892. {
  3893. shared_ptr&lt;X&gt; px(new X);
  3894. // create weak pointers from px here
  3895. return px;
  3896. }
  3897. };</code></pre>
  3898. </div>
  3899. </div>
  3900. </li>
  3901. </ol>
  3902. </div>
  3903. </div>
  3904. </div>
  3905. </div>
  3906. <div class="sect1">
  3907. <h2 id="make_shared">make_shared: Creating shared_ptr</h2>
  3908. <div class="sectionbody">
  3909. <div class="sect2">
  3910. <h3 id="make_shared_description">Description</h3>
  3911. <div class="paragraph">
  3912. <p>The function templates <code>make_shared</code> and <code>allocate_shared</code> provide convenient,
  3913. safe and efficient ways to create <code>shared_ptr</code> objects.</p>
  3914. </div>
  3915. </div>
  3916. <div class="sect2">
  3917. <h3 id="make_shared_rationale">Rationale</h3>
  3918. <div class="paragraph">
  3919. <p>Consistent use of <code>shared_ptr</code> can eliminate the need to use an explicit
  3920. <code>delete</code>, but alone it provides no support in avoiding explicit <code>new</code>. There
  3921. were repeated requests from users for a factory function that creates an
  3922. object of a given type and returns a <code>shared_ptr</code> to it. Besides convenience
  3923. and style, such a function is also exception safe and considerably faster
  3924. because it can use a single allocation for both the object and its
  3925. corresponding control block, eliminating a significant portion of
  3926. <code>shared_ptr</code> construction overhead. This eliminates one of the major
  3927. efficiency complaints about <code>shared_ptr</code>.</p>
  3928. </div>
  3929. <div class="paragraph">
  3930. <p>The family of overloaded function templates, <code>make_shared</code> and
  3931. <code>allocate_shared</code>, were provided to address this need. <code>make_shared</code> uses the
  3932. global <code>operator new</code> to allocate memory, whereas <code>allocate_shared</code> uses an
  3933. user-supplied allocator, allowing finer control.</p>
  3934. </div>
  3935. <div class="paragraph">
  3936. <p>The rationale for choosing the name <code>make_shared</code> is that the expression
  3937. <code>make_shared&lt;Widget&gt;()</code> can be read aloud and conveys the intended meaning.</p>
  3938. </div>
  3939. <div class="paragraph">
  3940. <p>Originally the Boost function templates <code>allocate_shared</code> and <code>make_shared</code>
  3941. were provided for scalar objects only. There was a need to have efficient
  3942. allocation of array objects. One criticism of class template <code>shared_array</code>
  3943. was always the lack of a utility like <code>make_shared</code> that uses only a single
  3944. allocation. When <code>shared_ptr</code> was enhanced to support array types, additional
  3945. overloads of <code>allocate_shared</code> and <code>make_shared</code> were provided for array
  3946. types.</p>
  3947. </div>
  3948. </div>
  3949. <div class="sect2">
  3950. <h3 id="make_shared_synopsis">Synopsis</h3>
  3951. <div class="paragraph">
  3952. <p><code>make_shared</code> and <code>allocate_shared</code> are defined in
  3953. <code>&lt;boost/smart_ptr/make_shared.hpp&gt;</code>.</p>
  3954. </div>
  3955. <div class="listingblock">
  3956. <div class="content">
  3957. <pre class="highlight"><code>namespace boost {
  3958. <code>// T is not an array</code>
  3959. template&lt;class T, class... Args&gt;
  3960. shared_ptr&lt;T&gt; make_shared(Args&amp;&amp;... args);
  3961. template&lt;class T, class A, class... Args&gt;
  3962. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, Args&amp;&amp;... args);
  3963. <code>// T is an array of unknown bounds</code>
  3964. template&lt;class T&gt;
  3965. shared_ptr&lt;T&gt; make_shared(std::size_t n);
  3966. template&lt;class T, class A&gt;
  3967. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, std::size_t n);
  3968. <code>// T is an array of known bounds</code>
  3969. template&lt;class T&gt;
  3970. shared_ptr&lt;T&gt; make_shared();
  3971. template&lt;class T, class A&gt;
  3972. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a);
  3973. <code>// T is an array of unknown bounds</code>
  3974. template&lt;class T&gt; shared_ptr&lt;T&gt;
  3975. make_shared(std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);
  3976. template&lt;class T, class A&gt; shared_ptr&lt;T&gt;
  3977. allocate_shared(const A&amp; a, std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);
  3978. <code>// T is an array of known bounds</code>
  3979. template&lt;class T&gt;
  3980. shared_ptr&lt;T&gt; make_shared(const remove_extent_t&lt;T&gt;&amp; v);
  3981. template&lt;class T, class A&gt;
  3982. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, const remove_extent_t&lt;T&gt;&amp; v);
  3983. <code>// T is not an array of unknown bounds</code>
  3984. template&lt;class T&gt;
  3985. shared_ptr&lt;T&gt; make_shared_noinit();
  3986. template&lt;class T, class A&gt;
  3987. shared_ptr&lt;T&gt; allocate_shared_noinit(const A&amp; a);
  3988. <code>// T is an array of unknown bounds</code>
  3989. template&lt;class T&gt;
  3990. shared_ptr&lt;T&gt; make_shared_noinit(std::size_t n);
  3991. template&lt;class T, class A&gt;
  3992. shared_ptr&lt;T&gt; allocate_shared_noinit(const A&amp; a, std::size_t n);
  3993. }</code></pre>
  3994. </div>
  3995. </div>
  3996. </div>
  3997. <div class="sect2">
  3998. <h3 id="make_shared_common_requirements">Common Requirements</h3>
  3999. <div class="paragraph">
  4000. <p>The common requirements that apply to all <code>make_shared</code> and <code>allocate_shared</code>
  4001. overloads, unless specified otherwise, are described below.</p>
  4002. </div>
  4003. <div class="dlist">
  4004. <dl>
  4005. <dt class="hdlist1">Requires</dt>
  4006. <dd>
  4007. <p><code>A</code> shall be an <em>allocator</em>. The copy constructor and destructor
  4008. of <code>A</code> shall not throw exceptions.</p>
  4009. </dd>
  4010. <dt class="hdlist1">Effects</dt>
  4011. <dd>
  4012. <p>Allocates memory for an object of type <code>T</code> or <code>n</code> objects of <code>U</code>
  4013. (if <code>T</code> is an array type of the form <code>U[]</code> and <code>n</code> is determined by
  4014. arguments, as specified by the concrete overload). The object is initialized
  4015. from arguments as specified by the concrete overload. Uses a rebound copy of
  4016. <code>a</code> (for an unspecified <code>value_type</code>) to allocate memory. If an exception is
  4017. thrown, the functions have no effect.</p>
  4018. </dd>
  4019. <dt class="hdlist1">Returns</dt>
  4020. <dd>
  4021. <p>A <code>shared_ptr</code> instance that stores and owns the address of the
  4022. newly constructed object.</p>
  4023. </dd>
  4024. <dt class="hdlist1">Postconditions</dt>
  4025. <dd>
  4026. <p><code>r.get() != 0</code> and <code>r.use_count() == 1</code>, where <code>r</code>
  4027. is the return value.</p>
  4028. </dd>
  4029. <dt class="hdlist1">Throws</dt>
  4030. <dd>
  4031. <p><code>std::bad_alloc</code>, an exception thrown from <code>A::allocate</code>, or from the
  4032. initialization of the object.</p>
  4033. </dd>
  4034. <dt class="hdlist1">Remarks</dt>
  4035. <dd>
  4036. <div class="ulist">
  4037. <ul>
  4038. <li>
  4039. <p>Performs no more than one memory allocation. This provides efficiency
  4040. equivalent to an intrusive smart pointer.</p>
  4041. </li>
  4042. <li>
  4043. <p>When an object of an array type is specified to be initialized to a value of
  4044. the same type <code>v</code>, this shall be interpreted to mean that each array element
  4045. of the object is initialized to the corresponding element from <code>v</code>.</p>
  4046. </li>
  4047. <li>
  4048. <p>When an object of an array type is specified to be value-initialized, this
  4049. shall be interpreted to mean that each array element of the object is
  4050. value-initialized.</p>
  4051. </li>
  4052. <li>
  4053. <p>When a (sub)object of non-array type <code>U</code> is specified to be initialized to
  4054. a value <code>v</code>, or constructed from <code>args...</code>, <code>make_shared</code> shall perform
  4055. this initialization via the expression <code>::new(p) U(expr)</code> (where
  4056. <code><em>expr</em></code> is <code>v</code> or <code>std::forward&lt;Args&gt;(args)...)</code> respectively) and <code>p</code>
  4057. has type <code>void*</code> and points to storage suitable to hold an object of type
  4058. <code>U</code>.</p>
  4059. </li>
  4060. <li>
  4061. <p>When a (sub)object of non-array type <code>U</code> is specified to be initialized to
  4062. a value <code>v</code>, or constructed from <code>args...</code>, <code>allocate_shared</code> shall
  4063. perform this initialization via the expression
  4064. <code>std::allocator_traits&lt;A2&gt;::construct(a2, p, expr)</code> (where
  4065. <code><em>expr</em></code> is <code>v</code> or <code>std::forward&lt;Args&gt;(args)...)</code> respectively), <code>p</code>
  4066. points to storage suitable to hold an object of type <code>U</code>, and <code>a2</code> of
  4067. type <code>A2</code> is a potentially rebound copy of <code>a</code>.</p>
  4068. </li>
  4069. <li>
  4070. <p>When a (sub)object of non-array type <code>U</code> is specified to be
  4071. default-initialized, <code>make_shared_noinit</code> and <code>allocate_shared_noinit</code> shall
  4072. perform this initialization via the expression <code>::new(p) U</code>, where
  4073. <code>p</code> has type <code>void*</code> and points to storage suitable to hold an object of
  4074. type <code>U</code>.</p>
  4075. </li>
  4076. <li>
  4077. <p>When a (sub)object of non-array type <code>U</code> is specified to be
  4078. value-initialized, <code>make_shared</code> shall perform this initialization via the
  4079. expression <code>::new(p) U()</code>, where <code>p</code> has type <code>void*</code> and points to
  4080. storage suitable to hold an object of type <code>U</code>.</p>
  4081. </li>
  4082. <li>
  4083. <p>When a (sub)object of non-array type <code>U</code> is specified to be
  4084. value-initialized, <code>allocate_shared</code> shall perform this initialization via the
  4085. expression <code>std::allocator_traits&lt;A2&gt;::construct(a2, p)</code>, where
  4086. <code>p</code> points to storage suitable to hold an object of type <code>U</code> and <code>a2</code> of
  4087. type <code>A2</code> is a potentially rebound copy of <code>a</code>.</p>
  4088. </li>
  4089. <li>
  4090. <p>Array elements are initialized in ascending order of their addresses.</p>
  4091. </li>
  4092. <li>
  4093. <p>When the lifetime of the object managed by the return value ends, or when
  4094. the initialization of an array element throws an exception, the initialized
  4095. elements should be destroyed in the reverse order of their construction.</p>
  4096. </li>
  4097. </ul>
  4098. </div>
  4099. </dd>
  4100. </dl>
  4101. </div>
  4102. <div class="admonitionblock note">
  4103. <table>
  4104. <tr>
  4105. <td class="icon">
  4106. <div class="title">Note</div>
  4107. </td>
  4108. <td class="content">
  4109. These functions will typically allocate more memory than the total size
  4110. of the element objects to allow for internal bookkeeping structures such as
  4111. the reference counts.
  4112. </td>
  4113. </tr>
  4114. </table>
  4115. </div>
  4116. </div>
  4117. <div class="sect2">
  4118. <h3 id="make_shared_free_functions">Free Functions</h3>
  4119. <div class="listingblock">
  4120. <div class="content">
  4121. <pre class="highlight"><code>template&lt;class T, class... Args&gt;
  4122. shared_ptr&lt;T&gt; make_shared(Args&amp;&amp;... args);</code></pre>
  4123. </div>
  4124. </div>
  4125. <div class="listingblock">
  4126. <div class="content">
  4127. <pre class="highlight"><code>template&lt;class T, class A, class... Args&gt;
  4128. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, Args&amp;&amp;... args);</code></pre>
  4129. </div>
  4130. </div>
  4131. <div class="ulist none">
  4132. <ul class="none">
  4133. <li>
  4134. <p></p>
  4135. <div class="dlist">
  4136. <dl>
  4137. <dt class="hdlist1">Constraints</dt>
  4138. <dd>
  4139. <p><code>T</code> is not an array.</p>
  4140. </dd>
  4141. <dt class="hdlist1">Returns</dt>
  4142. <dd>
  4143. <p>A <code>shared_ptr</code> to an object of type <code>T</code>, constructed from
  4144. <code>args...</code>.</p>
  4145. </dd>
  4146. <dt class="hdlist1">Examples</dt>
  4147. </dl>
  4148. </div>
  4149. </li>
  4150. <li>
  4151. <p><code>auto p = make_shared&lt;int&gt;();</code></p>
  4152. </li>
  4153. <li>
  4154. <p><code>auto p = make_shared&lt;std::vector&lt;int&gt; &gt;(16, 1);</code></p>
  4155. </li>
  4156. </ul>
  4157. </div>
  4158. <div class="listingblock">
  4159. <div class="content">
  4160. <pre class="highlight"><code>template&lt;class T&gt;
  4161. shared_ptr&lt;T&gt; make_shared(std::size_t n);</code></pre>
  4162. </div>
  4163. </div>
  4164. <div class="listingblock">
  4165. <div class="content">
  4166. <pre class="highlight"><code>template&lt;class T, class A&gt;
  4167. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, std::size_t n);</code></pre>
  4168. </div>
  4169. </div>
  4170. <div class="ulist none">
  4171. <ul class="none">
  4172. <li>
  4173. <p></p>
  4174. <div class="dlist">
  4175. <dl>
  4176. <dt class="hdlist1">Constraints</dt>
  4177. <dd>
  4178. <p><code>T</code> is an array of unknown bounds.</p>
  4179. </dd>
  4180. <dt class="hdlist1">Returns</dt>
  4181. <dd>
  4182. <p>A <code>shared_ptr</code> to a sequence of <code>n</code> value-initialized objects of
  4183. type <code>remove_extent_t&lt;T&gt;</code>.</p>
  4184. </dd>
  4185. <dt class="hdlist1">Examples</dt>
  4186. </dl>
  4187. </div>
  4188. </li>
  4189. <li>
  4190. <p><code>auto p = make_shared&lt;double[]&gt;(1024);</code></p>
  4191. </li>
  4192. <li>
  4193. <p><code>auto p = make_shared&lt;double[][2][2]&gt;(6);</code></p>
  4194. </li>
  4195. </ul>
  4196. </div>
  4197. <div class="listingblock">
  4198. <div class="content">
  4199. <pre class="highlight"><code>template&lt;class T&gt;
  4200. shared_ptr&lt;T&gt; make_shared();</code></pre>
  4201. </div>
  4202. </div>
  4203. <div class="listingblock">
  4204. <div class="content">
  4205. <pre class="highlight"><code>template&lt;class T, class A&gt;
  4206. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a);</code></pre>
  4207. </div>
  4208. </div>
  4209. <div class="ulist none">
  4210. <ul class="none">
  4211. <li>
  4212. <p></p>
  4213. <div class="dlist">
  4214. <dl>
  4215. <dt class="hdlist1">Constraints</dt>
  4216. <dd>
  4217. <p><code>T</code> is an array of known bounds.</p>
  4218. </dd>
  4219. <dt class="hdlist1">Returns</dt>
  4220. <dd>
  4221. <p>A <code>shared_ptr</code> to a sequence of <code>extent_v&lt;T&gt;</code> value-initialized
  4222. objects of type <code>remove_extent_t&lt;T&gt;</code>.</p>
  4223. </dd>
  4224. <dt class="hdlist1">Examples</dt>
  4225. </dl>
  4226. </div>
  4227. </li>
  4228. <li>
  4229. <p><code>auto p = make_shared&lt;double[1024]&gt;();</code></p>
  4230. </li>
  4231. <li>
  4232. <p><code>auto p = make_shared&lt;double[6][2][2]&gt;();</code></p>
  4233. </li>
  4234. </ul>
  4235. </div>
  4236. <div class="listingblock">
  4237. <div class="content">
  4238. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T&gt;
  4239. make_shared(std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  4240. </div>
  4241. </div>
  4242. <div class="listingblock">
  4243. <div class="content">
  4244. <pre class="highlight"><code>template&lt;class T, class A&gt; shared_ptr&lt;T&gt;
  4245. allocate_shared(const A&amp; a, std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  4246. </div>
  4247. </div>
  4248. <div class="ulist none">
  4249. <ul class="none">
  4250. <li>
  4251. <p></p>
  4252. <div class="dlist">
  4253. <dl>
  4254. <dt class="hdlist1">Constraints</dt>
  4255. <dd>
  4256. <p><code>T</code> is an array of unknown bounds.</p>
  4257. </dd>
  4258. <dt class="hdlist1">Returns</dt>
  4259. <dd>
  4260. <p>A <code>shared_ptr</code> to a sequence of <code>n</code> objects of type
  4261. <code>remove_extent_t&lt;T&gt;</code>, each initialized to <code>v</code>.</p>
  4262. </dd>
  4263. <dt class="hdlist1">Examples</dt>
  4264. </dl>
  4265. </div>
  4266. </li>
  4267. <li>
  4268. <p><code>auto p = make_shared&lt;double[]&gt;(1024, 1.0);</code></p>
  4269. </li>
  4270. <li>
  4271. <p><code>auto p = make_shared&lt;double[][2]&gt;(6, {1.0, 0.0});</code></p>
  4272. </li>
  4273. <li>
  4274. <p><code>auto p = make_shared&lt;std::vector&lt;int&gt;[]&gt;(4, {1, 2});</code></p>
  4275. </li>
  4276. </ul>
  4277. </div>
  4278. <div class="listingblock">
  4279. <div class="content">
  4280. <pre class="highlight"><code>template&lt;class T&gt;
  4281. shared_ptr&lt;T&gt; make_shared(const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  4282. </div>
  4283. </div>
  4284. <div class="listingblock">
  4285. <div class="content">
  4286. <pre class="highlight"><code>template&lt;class T, class A&gt;
  4287. shared_ptr&lt;T&gt; allocate_shared(const A&amp; a, const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  4288. </div>
  4289. </div>
  4290. <div class="ulist none">
  4291. <ul class="none">
  4292. <li>
  4293. <p></p>
  4294. <div class="dlist">
  4295. <dl>
  4296. <dt class="hdlist1">Constraints</dt>
  4297. <dd>
  4298. <p><code>T</code> is an array of known bounds.</p>
  4299. </dd>
  4300. <dt class="hdlist1">Returns</dt>
  4301. <dd>
  4302. <p>A <code>shared_ptr</code> to a sequence of <code>extent_v&lt;T&gt;</code> objects of type
  4303. <code>remove_extent_t&lt;T&gt;</code>, each initialized to <code>v</code>.</p>
  4304. </dd>
  4305. <dt class="hdlist1">Examples</dt>
  4306. </dl>
  4307. </div>
  4308. </li>
  4309. <li>
  4310. <p><code>auto p = make_shared&lt;double[1024]&gt;(1.0);</code></p>
  4311. </li>
  4312. <li>
  4313. <p><code>auto p = make_shared&lt;double[6][2]&gt;({1.0, 0.0});</code></p>
  4314. </li>
  4315. <li>
  4316. <p><code>auto p = make_shared&lt;std::vector&lt;int&gt;[4]&gt;({1, 2});</code></p>
  4317. </li>
  4318. </ul>
  4319. </div>
  4320. <div class="listingblock">
  4321. <div class="content">
  4322. <pre class="highlight"><code>template&lt;class T&gt;
  4323. shared_ptr&lt;T&gt; make_shared_noinit();</code></pre>
  4324. </div>
  4325. </div>
  4326. <div class="listingblock">
  4327. <div class="content">
  4328. <pre class="highlight"><code>template&lt;class T, class A&gt;
  4329. shared_ptr&lt;T&gt; allocate_shared_noinit(const A&amp; a);</code></pre>
  4330. </div>
  4331. </div>
  4332. <div class="ulist none">
  4333. <ul class="none">
  4334. <li>
  4335. <p></p>
  4336. <div class="dlist">
  4337. <dl>
  4338. <dt class="hdlist1">Constraints</dt>
  4339. <dd>
  4340. <p><code>T</code> is not an array, or is an array of known bounds.</p>
  4341. </dd>
  4342. <dt class="hdlist1">Returns</dt>
  4343. <dd>
  4344. <p>A <code>shared_ptr</code> to a default-initialized object of type <code>T</code>, or a
  4345. sequence of <code>extent_v&lt;T&gt;</code> default-initialized objects of type
  4346. <code>remove_extent_t&lt;T&gt;</code>, respectively.</p>
  4347. </dd>
  4348. <dt class="hdlist1">Example</dt>
  4349. <dd>
  4350. <p><code>auto p = make_shared_noinit&lt;double[1024]&gt;();</code></p>
  4351. </dd>
  4352. </dl>
  4353. </div>
  4354. </li>
  4355. </ul>
  4356. </div>
  4357. <div class="listingblock">
  4358. <div class="content">
  4359. <pre class="highlight"><code>template&lt;class T&gt;
  4360. shared_ptr&lt;T&gt; make_shared_noinit(std::size_t n);</code></pre>
  4361. </div>
  4362. </div>
  4363. <div class="listingblock">
  4364. <div class="content">
  4365. <pre class="highlight"><code>template&lt;class T, class A&gt;
  4366. shared_ptr&lt;T&gt; allocate_shared_noinit(const A&amp; a, std::size_t n);</code></pre>
  4367. </div>
  4368. </div>
  4369. <div class="ulist none">
  4370. <ul class="none">
  4371. <li>
  4372. <p></p>
  4373. <div class="dlist">
  4374. <dl>
  4375. <dt class="hdlist1">Constraints</dt>
  4376. <dd>
  4377. <p><code>T</code> is an array of unknown bounds.</p>
  4378. </dd>
  4379. <dt class="hdlist1">Returns</dt>
  4380. <dd>
  4381. <p>A <code>shared_ptr</code> to a sequence of <code><em>n</em></code> default-initialized objects
  4382. of type <code>remove_extent_t&lt;T&gt;</code>.</p>
  4383. </dd>
  4384. <dt class="hdlist1">Example</dt>
  4385. <dd>
  4386. <p><code>auto p = make_shared_noinit&lt;double[]&gt;(1024);</code></p>
  4387. </dd>
  4388. </dl>
  4389. </div>
  4390. </li>
  4391. </ul>
  4392. </div>
  4393. </div>
  4394. </div>
  4395. </div>
  4396. <div class="sect1">
  4397. <h2 id="enable_shared_from_this">enable_shared_from_this</h2>
  4398. <div class="sectionbody">
  4399. <div class="sect2">
  4400. <h3 id="enable_shared_from_this_description">Description</h3>
  4401. <div class="paragraph">
  4402. <p>The class template <code>enable_shared_from_this</code> is used as a base class that allows
  4403. a <code>shared_ptr</code> or a <code>weak_ptr</code> to the current object to be obtained from within a
  4404. member function.</p>
  4405. </div>
  4406. <div class="paragraph">
  4407. <p><code>enable_shared_from_this&lt;T&gt;</code> defines two member functions called <code>shared_from_this</code>
  4408. that return a <code>shared_ptr&lt;T&gt;</code> and <code>shared_ptr&lt;T const&gt;</code>, depending on constness, to
  4409. <code>this</code>. It also defines two member functions called <code>weak_from_this</code> that return a
  4410. corresponding <code>weak_ptr</code>.</p>
  4411. </div>
  4412. </div>
  4413. <div class="sect2">
  4414. <h3 id="enable_shared_from_this_example">Example</h3>
  4415. <div class="listingblock">
  4416. <div class="content">
  4417. <pre class="highlight"><code>#include &lt;boost/enable_shared_from_this.hpp&gt;
  4418. #include &lt;boost/shared_ptr.hpp&gt;
  4419. #include &lt;cassert&gt;
  4420. class Y: public boost::enable_shared_from_this&lt;Y&gt;
  4421. {
  4422. public:
  4423. boost::shared_ptr&lt;Y&gt; f()
  4424. {
  4425. return shared_from_this();
  4426. }
  4427. };
  4428. int main()
  4429. {
  4430. boost::shared_ptr&lt;Y&gt; p(new Y);
  4431. boost::shared_ptr&lt;Y&gt; q = p-&gt;f();
  4432. assert(p == q);
  4433. assert(!(p &lt; q || q &lt; p)); // p and q must share ownership
  4434. }</code></pre>
  4435. </div>
  4436. </div>
  4437. </div>
  4438. <div class="sect2">
  4439. <h3 id="enable_shared_from_this_synopsis">Synopsis</h3>
  4440. <div class="paragraph">
  4441. <p><code>enable_shared_from_this</code> is defined in <code>&lt;boost/smart_ptr/enable_shared_from_this.hpp&gt;</code>.</p>
  4442. </div>
  4443. <div class="listingblock">
  4444. <div class="content">
  4445. <pre class="highlight"><code>namespace boost {
  4446. template&lt;class T&gt; class enable_shared_from_this {
  4447. private:
  4448. // exposition only
  4449. weak_ptr&lt;T&gt; weak_this_;
  4450. protected:
  4451. enable_shared_from_this() = default;
  4452. ~enable_shared_from_this() = default;
  4453. enable_shared_from_this(const enable_shared_from_this&amp;) noexcept;
  4454. enable_shared_from_this&amp; operator=(const enable_shared_from_this&amp;) noexcept;
  4455. public:
  4456. shared_ptr&lt;T&gt; shared_from_this();
  4457. shared_ptr&lt;T const&gt; shared_from_this() const;
  4458. weak_ptr&lt;T&gt; weak_from_this() noexcept;
  4459. weak_ptr&lt;T const&gt; weak_from_this() const noexcept;
  4460. }
  4461. }</code></pre>
  4462. </div>
  4463. </div>
  4464. </div>
  4465. <div class="sect2">
  4466. <h3 id="enable_shared_from_this_members">Members</h3>
  4467. <div class="listingblock">
  4468. <div class="content">
  4469. <pre class="highlight"><code>enable_shared_from_this(enable_shared_from_this const &amp;) noexcept;</code></pre>
  4470. </div>
  4471. </div>
  4472. <div class="ulist none">
  4473. <ul class="none">
  4474. <li>
  4475. <p></p>
  4476. <div class="dlist">
  4477. <dl>
  4478. <dt class="hdlist1">Effects</dt>
  4479. <dd>
  4480. <p>Default-constructs <code>weak_this_</code>.</p>
  4481. </dd>
  4482. </dl>
  4483. </div>
  4484. </li>
  4485. </ul>
  4486. </div>
  4487. <div class="admonitionblock note">
  4488. <table>
  4489. <tr>
  4490. <td class="icon">
  4491. <div class="title">Note</div>
  4492. </td>
  4493. <td class="content">
  4494. <code>weak_this_</code> is <em>not</em> copied from the argument.
  4495. </td>
  4496. </tr>
  4497. </table>
  4498. </div>
  4499. <div class="listingblock">
  4500. <div class="content">
  4501. <pre class="highlight"><code>enable_shared_from_this&amp; operator=(enable_shared_from_this const &amp;) noexcept;</code></pre>
  4502. </div>
  4503. </div>
  4504. <div class="ulist none">
  4505. <ul class="none">
  4506. <li>
  4507. <p></p>
  4508. <div class="dlist">
  4509. <dl>
  4510. <dt class="hdlist1">Returns</dt>
  4511. <dd>
  4512. <p><code>*this</code>.</p>
  4513. </dd>
  4514. </dl>
  4515. </div>
  4516. </li>
  4517. </ul>
  4518. </div>
  4519. <div class="admonitionblock note">
  4520. <table>
  4521. <tr>
  4522. <td class="icon">
  4523. <div class="title">Note</div>
  4524. </td>
  4525. <td class="content">
  4526. <code>weak_this_</code> is unchanged.
  4527. </td>
  4528. </tr>
  4529. </table>
  4530. </div>
  4531. <div class="listingblock">
  4532. <div class="content">
  4533. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T&gt; shared_from_this();</code></pre>
  4534. </div>
  4535. </div>
  4536. <div class="listingblock">
  4537. <div class="content">
  4538. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T const&gt; shared_from_this() const;</code></pre>
  4539. </div>
  4540. </div>
  4541. <div class="ulist none">
  4542. <ul class="none">
  4543. <li>
  4544. <p></p>
  4545. <div class="dlist">
  4546. <dl>
  4547. <dt class="hdlist1">Returns</dt>
  4548. <dd>
  4549. <p><code>shared_ptr&lt;T&gt;(weak_this_)</code>.</p>
  4550. </dd>
  4551. </dl>
  4552. </div>
  4553. </li>
  4554. </ul>
  4555. </div>
  4556. <div class="admonitionblock note">
  4557. <table>
  4558. <tr>
  4559. <td class="icon">
  4560. <div class="title">Note</div>
  4561. </td>
  4562. <td class="content">
  4563. These members throw <code>bad_weak_ptr</code> when <code>*this</code> is not owned by a <code>shared_ptr</code>.
  4564. </td>
  4565. </tr>
  4566. </table>
  4567. </div>
  4568. <div class="admonitionblock note">
  4569. <table>
  4570. <tr>
  4571. <td class="icon">
  4572. <div class="title">Note</div>
  4573. </td>
  4574. <td class="content">
  4575. <div class="paragraph">
  4576. <p><code>weak_this_</code> is initialized by <code>shared_ptr</code> to a copy of itself when it&#8217;s constructed by a pointer to <code>*this</code>.
  4577. For example, in the following code:</p>
  4578. </div>
  4579. <div class="listingblock">
  4580. <div class="content">
  4581. <pre class="highlight"><code>class Y: public boost::enable_shared_from_this&lt;Y&gt; {};
  4582. int main()
  4583. {
  4584. boost::shared_ptr&lt;Y&gt; p(new Y);
  4585. }</code></pre>
  4586. </div>
  4587. </div>
  4588. <div class="paragraph">
  4589. <p>the construction of <code>p</code> will automatically initialize <code>p-&gt;weak_this_</code> to <code>p</code>.</p>
  4590. </div>
  4591. </td>
  4592. </tr>
  4593. </table>
  4594. </div>
  4595. <div class="listingblock">
  4596. <div class="content">
  4597. <pre class="highlight"><code>template&lt;class T&gt; weak_ptr&lt;T&gt; weak_from_this() noexcept;</code></pre>
  4598. </div>
  4599. </div>
  4600. <div class="listingblock">
  4601. <div class="content">
  4602. <pre class="highlight"><code>template&lt;class T&gt; weak_ptr&lt;T const&gt; weak_from_this() const noexcept;</code></pre>
  4603. </div>
  4604. </div>
  4605. <div class="ulist none">
  4606. <ul class="none">
  4607. <li>
  4608. <p></p>
  4609. <div class="dlist">
  4610. <dl>
  4611. <dt class="hdlist1">Returns</dt>
  4612. <dd>
  4613. <p><code>weak_this_</code>.</p>
  4614. </dd>
  4615. </dl>
  4616. </div>
  4617. </li>
  4618. </ul>
  4619. </div>
  4620. <div class="admonitionblock note">
  4621. <table>
  4622. <tr>
  4623. <td class="icon">
  4624. <div class="title">Note</div>
  4625. </td>
  4626. <td class="content">
  4627. Unlike <code>shared_from_this()</code>, <code>weak_from_this()</code> is valid in a destructor
  4628. and returns a <code>weak_ptr</code> that is <code>expired()</code> but still shares ownership
  4629. with other <code>weak_ptr</code> instances (if any) that refer to the object.
  4630. </td>
  4631. </tr>
  4632. </table>
  4633. </div>
  4634. </div>
  4635. </div>
  4636. </div>
  4637. <div class="sect1">
  4638. <h2 id="enable_shared_from">enable_shared_from</h2>
  4639. <div class="sectionbody">
  4640. <div class="sect2">
  4641. <h3 id="enable_shared_from_description">Description</h3>
  4642. <div class="paragraph">
  4643. <p><code>enable_shared_from</code> is used as a base class that allows a <code>shared_ptr</code> or a
  4644. <code>weak_ptr</code> to be obtained given a raw pointer to the object, by using the
  4645. functions <code>shared_from</code> and <code>weak_from</code>.</p>
  4646. </div>
  4647. <div class="paragraph">
  4648. <p><code>enable_shared_from</code> differs from <code>enable_shared_from_this&lt;T&gt;</code> by the fact
  4649. that it&#8217;s not a template, and is its recommended replacement for new code.</p>
  4650. </div>
  4651. </div>
  4652. <div class="sect2">
  4653. <h3 id="enable_shared_from_example">Example</h3>
  4654. <div class="listingblock">
  4655. <div class="content">
  4656. <pre class="highlight"><code>#include &lt;boost/smart_ptr/enable_shared_from.hpp&gt;
  4657. #include &lt;boost/shared_ptr.hpp&gt;
  4658. #include &lt;cassert&gt;
  4659. class Y: public boost::enable_shared_from
  4660. {
  4661. public:
  4662. boost::shared_ptr&lt;Y&gt; f()
  4663. {
  4664. return boost::shared_from( this );
  4665. }
  4666. };
  4667. int main()
  4668. {
  4669. boost::shared_ptr&lt;Y&gt; p(new Y);
  4670. boost::shared_ptr&lt;Y&gt; q = p-&gt;f();
  4671. assert(p == q);
  4672. assert(!(p &lt; q || q &lt; p)); // p and q must share ownership
  4673. }</code></pre>
  4674. </div>
  4675. </div>
  4676. </div>
  4677. <div class="sect2">
  4678. <h3 id="enable_shared_from_synopsis">Synopsis</h3>
  4679. <div class="paragraph">
  4680. <p><code>enable_shared_from</code> is defined in <code>&lt;boost/smart_ptr/enable_shared_from.hpp&gt;</code>.</p>
  4681. </div>
  4682. <div class="listingblock">
  4683. <div class="content">
  4684. <pre class="highlight"><code>namespace boost {
  4685. class enable_shared_from: public enable_shared_from_this&lt;enable_shared_from&gt;
  4686. {
  4687. };
  4688. template&lt;class T&gt; shared_ptr&lt;T&gt; shared_from( T * p );
  4689. template&lt;class T&gt; weak_ptr&lt;T&gt; weak_from( T * p ) noexcept;
  4690. }</code></pre>
  4691. </div>
  4692. </div>
  4693. </div>
  4694. <div class="sect2">
  4695. <h3 id="enable_shared_from_functions">Functions</h3>
  4696. <div class="listingblock">
  4697. <div class="content">
  4698. <pre class="highlight"><code>template&lt;class T&gt; shared_ptr&lt;T&gt; shared_from( T * p );</code></pre>
  4699. </div>
  4700. </div>
  4701. <div class="ulist none">
  4702. <ul class="none">
  4703. <li>
  4704. <p></p>
  4705. <div class="dlist">
  4706. <dl>
  4707. <dt class="hdlist1">Returns</dt>
  4708. <dd>
  4709. <p><code>shared_ptr&lt;T&gt;( p-&gt;enable_shared_from::shared_from_this(), p )</code>.</p>
  4710. </dd>
  4711. </dl>
  4712. </div>
  4713. </li>
  4714. </ul>
  4715. </div>
  4716. <div class="admonitionblock note">
  4717. <table>
  4718. <tr>
  4719. <td class="icon">
  4720. <div class="title">Note</div>
  4721. </td>
  4722. <td class="content">
  4723. Throws <code>bad_weak_ptr</code> when <code>p</code> is not owned by a <code>shared_ptr</code>.
  4724. </td>
  4725. </tr>
  4726. </table>
  4727. </div>
  4728. <div class="listingblock">
  4729. <div class="content">
  4730. <pre class="highlight"><code>template&lt;class T&gt; weak_ptr&lt;T&gt; weak_from( T * p ) noexcept;</code></pre>
  4731. </div>
  4732. </div>
  4733. <div class="ulist none">
  4734. <ul class="none">
  4735. <li>
  4736. <p></p>
  4737. <div class="dlist">
  4738. <dl>
  4739. <dt class="hdlist1">Returns</dt>
  4740. <dd>
  4741. <p><code>weak_ptr&lt;T&gt;( p-&gt;enable_shared_from::weak_from_this(), p )</code>.</p>
  4742. </dd>
  4743. </dl>
  4744. </div>
  4745. </li>
  4746. </ul>
  4747. </div>
  4748. <div class="admonitionblock note">
  4749. <table>
  4750. <tr>
  4751. <td class="icon">
  4752. <div class="title">Note</div>
  4753. </td>
  4754. <td class="content">
  4755. Unlike <code>shared_from(this)</code>, <code>weak_from(this)</code> is valid in a destructor
  4756. and returns a <code>weak_ptr</code> that is <code>expired()</code> but still shares ownership
  4757. with other <code>weak_ptr</code> instances (if any) that refer to the object.
  4758. </td>
  4759. </tr>
  4760. </table>
  4761. </div>
  4762. </div>
  4763. </div>
  4764. </div>
  4765. <div class="sect1">
  4766. <h2 id="make_unique">make_unique: Creating unique_ptr</h2>
  4767. <div class="sectionbody">
  4768. <div class="sect2">
  4769. <h3 id="make_unique_description">Description</h3>
  4770. <div class="paragraph">
  4771. <p>The <code>make_unique</code> function templates provide convenient and safe ways to
  4772. create <code>std::unique_ptr</code> objects.</p>
  4773. </div>
  4774. </div>
  4775. <div class="sect2">
  4776. <h3 id="make_unique_rationale">Rationale</h3>
  4777. <div class="paragraph">
  4778. <p>The C&#43;&#43;11 standard introduced <code>std::unique_ptr</code> but did not provide any
  4779. <code>make_unique</code> utility like <code>std::make_shared</code> that provided the same
  4780. exception safety and facility to avoid writing <code>new</code> expressions. Before it
  4781. was implemented by some standard library vendors (and prior to the C&#43;&#43;14
  4782. standard introducing <code>std::make_unique</code>), this library provided it due to
  4783. requests from users.</p>
  4784. </div>
  4785. <div class="paragraph">
  4786. <p>This library also provides additional overloads of <code>make_unique</code> for
  4787. default-initialization, when users do not need or want to incur the expense
  4788. of value-initialization. The C&#43;&#43; standard does not yet provide this
  4789. feature with <code>std::make_unique</code>.</p>
  4790. </div>
  4791. </div>
  4792. <div class="sect2">
  4793. <h3 id="make_unique_synopsis">Synopsis</h3>
  4794. <div class="paragraph">
  4795. <p><code>make_unique</code> is defined in <code>&lt;boost/smart_ptr/make_unique.hpp&gt;</code>.</p>
  4796. </div>
  4797. <div class="listingblock">
  4798. <div class="content">
  4799. <pre class="highlight"><code>namespace boost {
  4800. <code>// T is not an array</code>
  4801. template&lt;class T, class... Args&gt;
  4802. std::unique_ptr&lt;T&gt; make_unique(Args&amp;&amp;... args);
  4803. <code>// T is not an array</code>
  4804. template&lt;class T&gt;
  4805. std::unique_ptr&lt;T&gt; make_unique(type_identity_t&lt;T&gt;&amp;&amp; v);
  4806. <code>// T is an array of unknown bounds</code>
  4807. template&lt;class T&gt;
  4808. std::unique_ptr&lt;T&gt; make_unique(std::size_t n);
  4809. <code>// T is not an array</code>
  4810. template&lt;class T&gt;
  4811. std::unique_ptr&lt;T&gt; make_unique_noinit();
  4812. <code>// T is an array of unknown bounds</code>
  4813. template&lt;class T&gt;
  4814. std::unique_ptr&lt;T&gt; make_unique_noinit(std::size_t n);
  4815. }</code></pre>
  4816. </div>
  4817. </div>
  4818. </div>
  4819. <div class="sect2">
  4820. <h3 id="make_unique_free_functions">Free Functions</h3>
  4821. <div class="listingblock">
  4822. <div class="content">
  4823. <pre class="highlight"><code>template&lt;class T, class... Args&gt;
  4824. std::unique_ptr&lt;T&gt; make_unique(Args&amp;&amp;... args);</code></pre>
  4825. </div>
  4826. </div>
  4827. <div class="ulist none">
  4828. <ul class="none">
  4829. <li>
  4830. <p></p>
  4831. <div class="dlist">
  4832. <dl>
  4833. <dt class="hdlist1">Constraints</dt>
  4834. <dd>
  4835. <p><code>T</code> is not an array.</p>
  4836. </dd>
  4837. <dt class="hdlist1">Returns</dt>
  4838. <dd>
  4839. <p><code>std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...)</code>.</p>
  4840. </dd>
  4841. <dt class="hdlist1">Example</dt>
  4842. <dd>
  4843. <p><code>auto p = make_unique&lt;int&gt;();</code></p>
  4844. </dd>
  4845. </dl>
  4846. </div>
  4847. </li>
  4848. </ul>
  4849. </div>
  4850. <div class="listingblock">
  4851. <div class="content">
  4852. <pre class="highlight"><code>template&lt;class T&gt;
  4853. std::unique_ptr&lt;T&gt; make_unique(type_identity_t&lt;T&gt;&amp;&amp; v);</code></pre>
  4854. </div>
  4855. </div>
  4856. <div class="ulist none">
  4857. <ul class="none">
  4858. <li>
  4859. <p></p>
  4860. <div class="dlist">
  4861. <dl>
  4862. <dt class="hdlist1">Constraints</dt>
  4863. <dd>
  4864. <p><code>T</code> is not an array.</p>
  4865. </dd>
  4866. <dt class="hdlist1">Returns</dt>
  4867. <dd>
  4868. <p><code>std::unique_ptr&lt;T&gt;(new T(std::move(v))</code>.</p>
  4869. </dd>
  4870. <dt class="hdlist1">Example</dt>
  4871. <dd>
  4872. <p><code>auto p = make_unique&lt;std::vector&lt;int&gt; &gt;({1, 2});</code></p>
  4873. </dd>
  4874. </dl>
  4875. </div>
  4876. </li>
  4877. </ul>
  4878. </div>
  4879. <div class="listingblock">
  4880. <div class="content">
  4881. <pre class="highlight"><code>template&lt;class T&gt;
  4882. std::unique_ptr&lt;T&gt; make_unique(std::size_t n);</code></pre>
  4883. </div>
  4884. </div>
  4885. <div class="ulist none">
  4886. <ul class="none">
  4887. <li>
  4888. <p></p>
  4889. <div class="dlist">
  4890. <dl>
  4891. <dt class="hdlist1">Constraints</dt>
  4892. <dd>
  4893. <p><code>T</code> is an array of unknown bounds.</p>
  4894. </dd>
  4895. <dt class="hdlist1">Returns</dt>
  4896. <dd>
  4897. <p><code>std::unique_ptr&lt;T&gt;(new remove_extent_t&lt;T&gt;[n]())</code>.</p>
  4898. </dd>
  4899. <dt class="hdlist1">Example</dt>
  4900. <dd>
  4901. <p><code>auto p = make_unique&lt;double[]&gt;(1024);</code></p>
  4902. </dd>
  4903. </dl>
  4904. </div>
  4905. </li>
  4906. </ul>
  4907. </div>
  4908. <div class="listingblock">
  4909. <div class="content">
  4910. <pre class="highlight"><code>template&lt;class T&gt;
  4911. std::unique_ptr&lt;T&gt; make_unique_noinit();</code></pre>
  4912. </div>
  4913. </div>
  4914. <div class="ulist none">
  4915. <ul class="none">
  4916. <li>
  4917. <p></p>
  4918. <div class="dlist">
  4919. <dl>
  4920. <dt class="hdlist1">Constraints</dt>
  4921. <dd>
  4922. <p><code>T</code> is not an array.</p>
  4923. </dd>
  4924. <dt class="hdlist1">Returns</dt>
  4925. <dd>
  4926. <p><code>std::unique_ptr&lt;T&gt;(new T)</code>.</p>
  4927. </dd>
  4928. <dt class="hdlist1">Example</dt>
  4929. <dd>
  4930. <p><code>auto p = make_unique_noinit&lt;double[1024]&gt;();</code></p>
  4931. </dd>
  4932. </dl>
  4933. </div>
  4934. </li>
  4935. </ul>
  4936. </div>
  4937. <div class="listingblock">
  4938. <div class="content">
  4939. <pre class="highlight"><code>template&lt;class T&gt;
  4940. std::unique_ptr&lt;T&gt; make_unique_noinit(std::size_t n);</code></pre>
  4941. </div>
  4942. </div>
  4943. <div class="ulist none">
  4944. <ul class="none">
  4945. <li>
  4946. <p></p>
  4947. <div class="dlist">
  4948. <dl>
  4949. <dt class="hdlist1">Constraints</dt>
  4950. <dd>
  4951. <p><code>T</code> is an array of unknown bounds.</p>
  4952. </dd>
  4953. <dt class="hdlist1">Returns</dt>
  4954. <dd>
  4955. <p><code>std::unique_ptr&lt;T&gt;(new remove_extent_t&lt;T&gt;[n])</code>.</p>
  4956. </dd>
  4957. <dt class="hdlist1">Example</dt>
  4958. <dd>
  4959. <p><code>auto p = make_unique_noinit&lt;double[]&gt;(1024);</code></p>
  4960. </dd>
  4961. </dl>
  4962. </div>
  4963. </li>
  4964. </ul>
  4965. </div>
  4966. </div>
  4967. </div>
  4968. </div>
  4969. <div class="sect1">
  4970. <h2 id="allocate_unique">allocate_unique: Creating unique_ptr</h2>
  4971. <div class="sectionbody">
  4972. <div class="sect2">
  4973. <h3 id="allocate_unique_description">Description</h3>
  4974. <div class="paragraph">
  4975. <p>The <code>allocate_unique</code> family of function templates provide convenient and safe
  4976. ways to obtain a <code>std::unique_ptr</code> that manages a new object created using an
  4977. allocator.</p>
  4978. </div>
  4979. </div>
  4980. <div class="sect2">
  4981. <h3 id="allocate_unique_rationale">Rationale</h3>
  4982. <div class="paragraph">
  4983. <p>The C&#43;&#43;14 standard introduced <code>std::make_unique</code> which used operator <code>new</code> to
  4984. create new objects. However, there is no convenient facility in the standard
  4985. library to use an allocator for the creation of the objects managed by
  4986. <code>std::unique_ptr</code>. Users writing allocator aware code have often requested an
  4987. <code>allocate_unique</code> factory function. This function is to <code>std::unique_ptr</code> what
  4988. <code>std::allocate_shared</code> is to <code>std::shared_ptr</code>.</p>
  4989. </div>
  4990. </div>
  4991. <div class="sect2">
  4992. <h3 id="allocate_unique_synopsis">Synopsis</h3>
  4993. <div class="paragraph">
  4994. <p><code>allocate_unique</code> is defined in <code>&lt;boost/smart_ptr/allocate_unique.hpp&gt;</code>.</p>
  4995. </div>
  4996. <div class="listingblock">
  4997. <div class="content">
  4998. <pre class="highlight"><code>namespace boost {
  4999. template&lt;class T, class A&gt;
  5000. class alloc_deleter;
  5001. template&lt;class T, class A&gt;
  5002. using alloc_noinit_deleter = alloc_deleter&lt;T, noinit_adaptor&lt;A&gt;&gt;;
  5003. <code>// T is not an array</code>
  5004. template&lt;class T, class A, class... Args&gt;
  5005. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5006. allocate_unique(const A&amp; a, Args&amp;&amp;... args);
  5007. <code>// T is not an array</code>
  5008. template&lt;class T, class A&gt;
  5009. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5010. allocate_unique(const A&amp; a, type_identity_t&lt;T&gt;&amp;&amp; v);
  5011. <code>// T is an array of unknown bounds</code>
  5012. template&lt;class T, class A&gt;
  5013. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5014. allocate_unique(const A&amp; a, std::size_t n);
  5015. <code>// T is an array of known bounds</code>
  5016. template&lt;class T, class A&gt;
  5017. std::unique_ptr&lt;remove_extent_t&lt;T&gt;[], alloc_deleter&lt;T, A&gt;&gt;
  5018. allocate_unique(const A&amp; a);
  5019. <code>// T is an array of unknown bounds</code>
  5020. template&lt;class T, class A&gt;
  5021. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5022. allocate_unique(const A&amp; a, std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);
  5023. <code>// T is an array of known bounds</code>
  5024. template&lt;class T, class A&gt;
  5025. std::unique_ptr&lt;remove_extent_t&lt;T&gt;[], alloc_deleter&lt;T, A&gt;&gt;
  5026. allocate_unique(const A&amp; a, const remove_extent_t&lt;T&gt;&amp; v);
  5027. <code>// T is not an array</code>
  5028. template&lt;class T, class A&gt;
  5029. std::unique_ptr&lt;T, alloc_noinit_deleter&lt;T, A&gt;&gt;
  5030. allocate_unique_noinit(const A&amp; a);
  5031. <code>// T is an array of unknown bounds</code>
  5032. template&lt;class T, class A&gt;
  5033. std::unique_ptr&lt;T, alloc_noinit_deleter&lt;T, A&gt;&gt;
  5034. allocate_unique_noinit(const A&amp; a, std::size_t n);
  5035. <code>// T is an array of known bounds</code>
  5036. template&lt;class T, class A&gt;
  5037. std::unique_ptr&lt;remove_extent_t&lt;T&gt;[], alloc_noinit_deleter&lt;T, A&gt;&gt;
  5038. allocate_unique_noinit(const A&amp; a);
  5039. }</code></pre>
  5040. </div>
  5041. </div>
  5042. </div>
  5043. <div class="sect2">
  5044. <h3 id="allocate_unique_common_requirements">Common Requirements</h3>
  5045. <div class="paragraph">
  5046. <p>The common requirements that apply to all <code>allocate_unique</code> and
  5047. <code>allocate_unique_noinit</code> overloads, unless specified otherwise, are described
  5048. below.</p>
  5049. </div>
  5050. <div class="dlist">
  5051. <dl>
  5052. <dt class="hdlist1">Requires</dt>
  5053. <dd>
  5054. <p><code>A</code> shall be an <em>allocator</em>. The copy constructor and destructor
  5055. of <code>A</code> shall not throw exceptions.</p>
  5056. </dd>
  5057. <dt class="hdlist1">Effects</dt>
  5058. <dd>
  5059. <p>Allocates memory for an object of type <code>T</code> or <code>n</code> objects of <code>U</code>
  5060. (if <code>T</code> is an array type of the form <code>U[]</code> and <code>n</code> is determined by
  5061. arguments, as specified by the concrete overload). The object is initialized
  5062. from arguments as specified by the concrete overload. Uses a rebound copy of
  5063. <code>a</code> (for an unspecified <code>value_type</code>) to allocate memory. If an exception is
  5064. thrown, the functions have no effect.</p>
  5065. </dd>
  5066. <dt class="hdlist1">Returns</dt>
  5067. <dd>
  5068. <p>A <code>std::unique_ptr</code> instance that stores and owns the address of the
  5069. newly constructed object.</p>
  5070. </dd>
  5071. <dt class="hdlist1">Postconditions</dt>
  5072. <dd>
  5073. <p><code>r.get() != 0</code>, where <code>r</code> is the return value.</p>
  5074. </dd>
  5075. <dt class="hdlist1">Throws</dt>
  5076. <dd>
  5077. <p>An exception thrown from <code>A::allocate</code>, or from the initialization of
  5078. the object.</p>
  5079. </dd>
  5080. <dt class="hdlist1">Remarks</dt>
  5081. <dd>
  5082. <div class="ulist">
  5083. <ul>
  5084. <li>
  5085. <p>When an object of an array type is specified to be initialized to a value of
  5086. the same type <code>v</code>, this shall be interpreted to mean that each array element
  5087. of the object is initialized to the corresponding element from <code>v</code>.</p>
  5088. </li>
  5089. <li>
  5090. <p>When an object of an array type is specified to be value-initialized, this
  5091. shall be interpreted to mean that each array element of the object is
  5092. value-initialized.</p>
  5093. </li>
  5094. <li>
  5095. <p>When a (sub)object of non-array type <code>U</code> is specified to be initialized to a
  5096. value <code>v</code>, or constructed from <code>args...</code>, <code>allocate_unique</code> shall perform this
  5097. initialization via the expression
  5098. <code>std::allocator_traits&lt;A2&gt;::construct(a2, p, expr)</code> (where <code><em>expr</em></code> is <code>v</code> or
  5099. <code>std::forward&lt;Args&gt;(args)...)</code> respectively), <code>p</code> points to storage suitable
  5100. to hold an object of type <code>U</code>, and <code>a2</code> of type <code>A2</code> is a potentially rebound
  5101. copy of <code>a</code>.</p>
  5102. </li>
  5103. <li>
  5104. <p>When a (sub)object of non-array type <code>U</code> is specified to be
  5105. default-initialized, <code>allocate_unique_noinit</code> shall perform this initialization
  5106. via the expression <code>::new(p) U</code>, where <code>p</code> has type <code>void*</code> and points to
  5107. storage suitable to hold an object of type <code>U</code>.</p>
  5108. </li>
  5109. <li>
  5110. <p>When a (sub)object of non-array type <code>U</code> is specified to be
  5111. value-initialized, <code>allocate_unique</code> shall perform this initialization via the
  5112. expression <code>std::allocator_traits&lt;A2&gt;::construct(a2, p)</code>, where <code>p</code> points to
  5113. storage suitable to hold an object of type <code>U</code> and <code>a2</code> of type <code>A2</code> is a
  5114. potentially rebound copy of <code>a</code>.</p>
  5115. </li>
  5116. <li>
  5117. <p>Array elements are initialized in ascending order of their addresses.</p>
  5118. </li>
  5119. <li>
  5120. <p>When the lifetime of the object managed by the return value ends, or when the
  5121. initialization of an array element throws an exception, the initialized
  5122. elements should be destroyed in the reverse order of their construction.</p>
  5123. </li>
  5124. </ul>
  5125. </div>
  5126. </dd>
  5127. </dl>
  5128. </div>
  5129. </div>
  5130. <div class="sect2">
  5131. <h3 id="allocate_unique_free_functions">Free Functions</h3>
  5132. <div class="listingblock">
  5133. <div class="content">
  5134. <pre class="highlight"><code>template&lt;class T, class A, class... Args&gt;
  5135. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5136. allocate_unique(const A&amp; a, Args&amp;&amp;... args);</code></pre>
  5137. </div>
  5138. </div>
  5139. <div class="ulist none">
  5140. <ul class="none">
  5141. <li>
  5142. <p></p>
  5143. <div class="dlist">
  5144. <dl>
  5145. <dt class="hdlist1">Constraints</dt>
  5146. <dd>
  5147. <p><code>T</code> is not an array.</p>
  5148. </dd>
  5149. <dt class="hdlist1">Returns</dt>
  5150. <dd>
  5151. <p>A <code>std::unique_ptr</code> to an object of type <code>T</code>, constructed from
  5152. <code>args...</code>.</p>
  5153. </dd>
  5154. <dt class="hdlist1">Examples</dt>
  5155. </dl>
  5156. </div>
  5157. </li>
  5158. <li>
  5159. <p><code>auto p = allocate_unique&lt;int&gt;(a);</code></p>
  5160. </li>
  5161. <li>
  5162. <p><code>auto p = allocate_unique&lt;std::vector&lt;int&gt;&gt;(a, 16, 1);</code></p>
  5163. </li>
  5164. </ul>
  5165. </div>
  5166. <div class="listingblock">
  5167. <div class="content">
  5168. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5169. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5170. allocate_unique(const A&amp; a, type_identity_t&lt;T&gt;&amp;&amp; v);</code></pre>
  5171. </div>
  5172. </div>
  5173. <div class="ulist none">
  5174. <ul class="none">
  5175. <li>
  5176. <p></p>
  5177. <div class="dlist">
  5178. <dl>
  5179. <dt class="hdlist1">Constraints</dt>
  5180. <dd>
  5181. <p><code>T</code> is not an array.</p>
  5182. </dd>
  5183. <dt class="hdlist1">Returns</dt>
  5184. <dd>
  5185. <p>A <code>std::unique_ptr</code> to an object of type <code>T</code>, constructed from <code>v</code>.</p>
  5186. </dd>
  5187. <dt class="hdlist1">Example</dt>
  5188. <dd>
  5189. <p><code>auto p = allocate_unique&lt;std::vector&lt;int&gt;&gt;(a, {1, 2});</code></p>
  5190. </dd>
  5191. </dl>
  5192. </div>
  5193. </li>
  5194. </ul>
  5195. </div>
  5196. <div class="listingblock">
  5197. <div class="content">
  5198. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5199. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5200. allocate_unique(const A&amp; a, std::size_t n);</code></pre>
  5201. </div>
  5202. </div>
  5203. <div class="ulist none">
  5204. <ul class="none">
  5205. <li>
  5206. <p></p>
  5207. <div class="dlist">
  5208. <dl>
  5209. <dt class="hdlist1">Constraints</dt>
  5210. <dd>
  5211. <p><code>T</code> is an array of unknown bounds.</p>
  5212. </dd>
  5213. <dt class="hdlist1">Returns</dt>
  5214. <dd>
  5215. <p>A <code>std::unique_ptr</code> to a sequence of <code>n</code> value-initialized objects of
  5216. type <code>remove_extent_t&lt;T&gt;</code>.</p>
  5217. </dd>
  5218. <dt class="hdlist1">Examples</dt>
  5219. </dl>
  5220. </div>
  5221. </li>
  5222. <li>
  5223. <p><code>auto p = allocate_unique&lt;double[]&gt;(a, 1024);</code></p>
  5224. </li>
  5225. <li>
  5226. <p><code>auto p = allocate_unique&lt;double[][2][2]&gt;(a, 6);</code></p>
  5227. </li>
  5228. </ul>
  5229. </div>
  5230. <div class="listingblock">
  5231. <div class="content">
  5232. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5233. std::unique_ptr&lt;remove_extent_t&lt;T&gt;[], alloc_deleter&lt;T, A&gt;&gt;
  5234. allocate_unique(const A&amp; a);</code></pre>
  5235. </div>
  5236. </div>
  5237. <div class="ulist none">
  5238. <ul class="none">
  5239. <li>
  5240. <p></p>
  5241. <div class="dlist">
  5242. <dl>
  5243. <dt class="hdlist1">Constraints</dt>
  5244. <dd>
  5245. <p><code>T</code> is an array of known bounds.</p>
  5246. </dd>
  5247. <dt class="hdlist1">Returns</dt>
  5248. <dd>
  5249. <p>A <code>std::unique_ptr</code> to a sequence of <code>extent_v&lt;T&gt;</code> value-initialized
  5250. objects of type <code>remove_extent_t&lt;T&gt;</code>.</p>
  5251. </dd>
  5252. <dt class="hdlist1">Examples</dt>
  5253. </dl>
  5254. </div>
  5255. </li>
  5256. <li>
  5257. <p><code>auto p = allocate_unique&lt;double[1024]&gt;(a);</code></p>
  5258. </li>
  5259. <li>
  5260. <p><code>auto p = allocate_unique&lt;double[6][2][2]&gt;(a);</code></p>
  5261. </li>
  5262. </ul>
  5263. </div>
  5264. <div class="listingblock">
  5265. <div class="content">
  5266. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5267. std::unique_ptr&lt;T, alloc_deleter&lt;T, A&gt;&gt;
  5268. allocate_unique(const A&amp; a, std::size_t n, const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  5269. </div>
  5270. </div>
  5271. <div class="ulist none">
  5272. <ul class="none">
  5273. <li>
  5274. <p></p>
  5275. <div class="dlist">
  5276. <dl>
  5277. <dt class="hdlist1">Constraints</dt>
  5278. <dd>
  5279. <p><code>T</code> is an array of unknown bounds.</p>
  5280. </dd>
  5281. <dt class="hdlist1">Returns</dt>
  5282. <dd>
  5283. <p>A <code>std::unique_ptr</code> to a sequence of <code>n</code> objects of type
  5284. <code>remove_extent_t&lt;T&gt;</code>, each initialized to <code>v</code>.</p>
  5285. </dd>
  5286. <dt class="hdlist1">Examples</dt>
  5287. </dl>
  5288. </div>
  5289. </li>
  5290. <li>
  5291. <p><code>auto p = allocate_unique&lt;double[]&gt;(a, 1024, 1.0);</code></p>
  5292. </li>
  5293. <li>
  5294. <p><code>auto p = allocate_unique&lt;double[][2]&gt;(a, 6, {1.0, 0.0});</code></p>
  5295. </li>
  5296. <li>
  5297. <p><code>auto p = allocate_unique&lt;std::vector&lt;int&gt;[]&gt;(a, 4, {1, 2});</code></p>
  5298. </li>
  5299. </ul>
  5300. </div>
  5301. <div class="listingblock">
  5302. <div class="content">
  5303. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5304. std::unique_ptr&lt;remove_extent_t&lt;T&gt;[], alloc_deleter&lt;T, A&gt;&gt;
  5305. allocate_unique(const A&amp; a, const remove_extent_t&lt;T&gt;&amp; v);</code></pre>
  5306. </div>
  5307. </div>
  5308. <div class="ulist none">
  5309. <ul class="none">
  5310. <li>
  5311. <p></p>
  5312. <div class="dlist">
  5313. <dl>
  5314. <dt class="hdlist1">Constraints</dt>
  5315. <dd>
  5316. <p><code>T</code> is an array of known bounds.</p>
  5317. </dd>
  5318. <dt class="hdlist1">Returns</dt>
  5319. <dd>
  5320. <p>A <code>std::unique_ptr</code> to a sequence of <code>extent_v&lt;T&gt;</code> objects of type
  5321. <code>remove_extent_t&lt;T&gt;</code>, each initialized to <code>v</code>.</p>
  5322. </dd>
  5323. <dt class="hdlist1">Examples</dt>
  5324. </dl>
  5325. </div>
  5326. </li>
  5327. <li>
  5328. <p><code>auto p = allocate_unique&lt;double[1024]&gt;(a, 1.0);</code></p>
  5329. </li>
  5330. <li>
  5331. <p><code>auto p = allocate_unique&lt;double[6][2]&gt;(a, {1.0, 0.0});</code></p>
  5332. </li>
  5333. <li>
  5334. <p><code>auto p = allocate_unique&lt;std::vector&lt;int&gt;[4]&gt;(a, {1, 2});</code></p>
  5335. </li>
  5336. </ul>
  5337. </div>
  5338. <div class="listingblock">
  5339. <div class="content">
  5340. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5341. std::unique_ptr&lt;T, alloc_noinit_deleter&lt;T, A&gt;&gt;
  5342. allocate_unique_noinit(const A&amp; a);</code></pre>
  5343. </div>
  5344. </div>
  5345. <div class="ulist none">
  5346. <ul class="none">
  5347. <li>
  5348. <p></p>
  5349. <div class="dlist">
  5350. <dl>
  5351. <dt class="hdlist1">Constraints</dt>
  5352. <dd>
  5353. <p><code>T</code> is not an array.</p>
  5354. </dd>
  5355. <dt class="hdlist1">Returns</dt>
  5356. <dd>
  5357. <p>A <code>std::unique_ptr</code> to a default-initialized object of type <code>T</code>.</p>
  5358. </dd>
  5359. <dt class="hdlist1">Example</dt>
  5360. <dd>
  5361. <p><code>auto p = allocate_unique_noinit&lt;double&gt;(a);</code></p>
  5362. </dd>
  5363. </dl>
  5364. </div>
  5365. </li>
  5366. </ul>
  5367. </div>
  5368. <div class="listingblock">
  5369. <div class="content">
  5370. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5371. std::unique_ptr&lt;T, alloc_noinit_deleter&lt;T, A&gt;&gt;
  5372. allocate_unique_noinit(const A&amp; a, std::size_t n);</code></pre>
  5373. </div>
  5374. </div>
  5375. <div class="ulist none">
  5376. <ul class="none">
  5377. <li>
  5378. <p></p>
  5379. <div class="dlist">
  5380. <dl>
  5381. <dt class="hdlist1">Constraints</dt>
  5382. <dd>
  5383. <p><code>T</code> is an array of unknown bounds.</p>
  5384. </dd>
  5385. <dt class="hdlist1">Returns</dt>
  5386. <dd>
  5387. <p>A <code>std::unique_ptr</code> to a sequence of <code>n</code> default-initialized objects
  5388. of type <code>remove_extent_t&lt;T&gt;</code>.</p>
  5389. </dd>
  5390. <dt class="hdlist1">Example</dt>
  5391. <dd>
  5392. <p><code>auto p = allocate_unique_noinit&lt;double[]&gt;(a, 1024);</code></p>
  5393. </dd>
  5394. </dl>
  5395. </div>
  5396. </li>
  5397. </ul>
  5398. </div>
  5399. <div class="listingblock">
  5400. <div class="content">
  5401. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5402. std::unique_ptr&lt;remove_extent_t&lt;T&gt;, alloc_noinit_deleter&lt;T, A&gt;&gt;
  5403. allocate_unique_noinit(const A&amp; a);</code></pre>
  5404. </div>
  5405. </div>
  5406. <div class="ulist none">
  5407. <ul class="none">
  5408. <li>
  5409. <p></p>
  5410. <div class="dlist">
  5411. <dl>
  5412. <dt class="hdlist1">Constraints</dt>
  5413. <dd>
  5414. <p><code>T</code> is an array of known bounds.</p>
  5415. </dd>
  5416. <dt class="hdlist1">Returns</dt>
  5417. <dd>
  5418. <p>A <code>std::unique_ptr</code> to a sequence of <code>extent_v&lt;T&gt;</code>
  5419. default-initialized objects of type <code>remove_extent_t&lt;T&gt;</code>.</p>
  5420. </dd>
  5421. <dt class="hdlist1">Example</dt>
  5422. <dd>
  5423. <p><code>auto p = allocate_unique_noinit&lt;double[1024]&gt;(a);</code></p>
  5424. </dd>
  5425. </dl>
  5426. </div>
  5427. </li>
  5428. </ul>
  5429. </div>
  5430. </div>
  5431. <div class="sect2">
  5432. <h3 id="allocate_unique_deleter">Deleter</h3>
  5433. <div class="paragraph">
  5434. <p>Class template <code>alloc_deleter</code> is the deleter used by the <code>allocate_unique</code>
  5435. functions.</p>
  5436. </div>
  5437. <div class="sect3">
  5438. <h4 id="allocate_unique_synopsis_2">Synopsis</h4>
  5439. <div class="listingblock">
  5440. <div class="content">
  5441. <pre class="highlight"><code>template&lt;class T, class A&gt;
  5442. class alloc_deleter {
  5443. public:
  5444. using pointer = <code>unspecified</code>;
  5445. explicit alloc_deleter(const A&amp; a) noexcept;
  5446. void operator()(pointer p);
  5447. };</code></pre>
  5448. </div>
  5449. </div>
  5450. </div>
  5451. <div class="sect3">
  5452. <h4 id="allocate_unique_members">Members</h4>
  5453. <div class="listingblock">
  5454. <div class="content">
  5455. <pre class="highlight"><code>using pointer = <code>unspecified</code>;</code></pre>
  5456. </div>
  5457. </div>
  5458. <div class="ulist none">
  5459. <ul class="none">
  5460. <li>
  5461. <p></p>
  5462. <div class="paragraph">
  5463. <p>A type that satisfies <em>NullablePointer</em>.</p>
  5464. </div>
  5465. </li>
  5466. </ul>
  5467. </div>
  5468. <div class="listingblock">
  5469. <div class="content">
  5470. <pre class="highlight"><code>explicit alloc_deleter(const A&amp; a) noexcept;</code></pre>
  5471. </div>
  5472. </div>
  5473. <div class="ulist none">
  5474. <ul class="none">
  5475. <li>
  5476. <p></p>
  5477. <div class="dlist">
  5478. <dl>
  5479. <dt class="hdlist1">Effects</dt>
  5480. <dd>
  5481. <p>Initializes the stored allocator from <code>a</code>.</p>
  5482. </dd>
  5483. </dl>
  5484. </div>
  5485. </li>
  5486. </ul>
  5487. </div>
  5488. <div class="listingblock">
  5489. <div class="content">
  5490. <pre class="highlight"><code>void operator()(pointer p);</code></pre>
  5491. </div>
  5492. </div>
  5493. <div class="ulist none">
  5494. <ul class="none">
  5495. <li>
  5496. <p></p>
  5497. <div class="dlist">
  5498. <dl>
  5499. <dt class="hdlist1">Effects</dt>
  5500. <dd>
  5501. <p>Destroys the objects and deallocates the storage referenced by <code>p</code>,
  5502. using the stored allocator.</p>
  5503. </dd>
  5504. </dl>
  5505. </div>
  5506. </li>
  5507. </ul>
  5508. </div>
  5509. </div>
  5510. </div>
  5511. </div>
  5512. </div>
  5513. <div class="sect1">
  5514. <h2 id="intrusive_ptr">intrusive_ptr: Managing Objects with Embedded Counts</h2>
  5515. <div class="sectionbody">
  5516. <div class="sect2">
  5517. <h3 id="intrusive_ptr_description">Description</h3>
  5518. <div class="paragraph">
  5519. <p>The <code>intrusive_ptr</code> class template stores a pointer to an object with an embedded reference count.
  5520. Every new <code>intrusive_ptr</code> instance increments the reference count by using an unqualified call to the
  5521. function <code>intrusive_ptr_add_ref</code>, passing it the pointer as an argument. Similarly, when an <code>intrusive_ptr</code>
  5522. is destroyed, it calls <code>intrusive_ptr_release</code>; this function is responsible for destroying the object when
  5523. its reference count drops to zero. The user is expected to provide suitable definitions of these two functions.
  5524. On compilers that support argument-dependent lookup, <code>intrusive_ptr_add_ref</code> and <code>intrusive_ptr_release</code> should
  5525. be defined in the namespace that corresponds to their parameter; otherwise, the definitions need to go in namespace
  5526. <code>boost</code>. The library provides a helper base class template <code><a href="#intrusive_ref_counter">intrusive_ref_counter</a></code> which
  5527. may help adding support for <code>intrusive_ptr</code> to user types.</p>
  5528. </div>
  5529. <div class="paragraph">
  5530. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to. <code>intrusive_ptr&lt;T&gt;</code> can be implicitly
  5531. converted to <code>intrusive_ptr&lt;U&gt;</code> whenever <code>T*</code> can be implicitly converted to <code>U*</code>.</p>
  5532. </div>
  5533. <div class="paragraph">
  5534. <p>The main reasons to use <code>intrusive_ptr</code> are:</p>
  5535. </div>
  5536. <div class="ulist">
  5537. <ul>
  5538. <li>
  5539. <p>Some existing frameworks or OSes provide objects with embedded reference counts;</p>
  5540. </li>
  5541. <li>
  5542. <p>The memory footprint of <code>intrusive_ptr</code> is the same as the corresponding raw pointer;</p>
  5543. </li>
  5544. <li>
  5545. <p><code>intrusive_ptr&lt;T&gt;</code> can be constructed from an arbitrary raw pointer of type <code>T*</code>.</p>
  5546. </li>
  5547. </ul>
  5548. </div>
  5549. <div class="paragraph">
  5550. <p>As a general rule, if it isn&#8217;t obvious whether <code>intrusive_ptr</code> better fits your needs than <code>shared_ptr</code>, try a <code>shared_ptr</code>-based design first.</p>
  5551. </div>
  5552. </div>
  5553. <div class="sect2">
  5554. <h3 id="intrusive_ptr_synopsis">Synopsis</h3>
  5555. <div class="paragraph">
  5556. <p><code>intrusive_ptr</code> is defined in <code>&lt;boost/smart_ptr/intrusive_ptr.hpp&gt;</code>.</p>
  5557. </div>
  5558. <div class="listingblock">
  5559. <div class="content">
  5560. <pre class="highlight"><code>namespace boost {
  5561. template&lt;class T&gt; class intrusive_ptr {
  5562. public:
  5563. typedef T element_type;
  5564. intrusive_ptr() noexcept;
  5565. intrusive_ptr(T * p, bool add_ref = true);
  5566. intrusive_ptr(intrusive_ptr const &amp; r);
  5567. template&lt;class Y&gt; intrusive_ptr(intrusive_ptr&lt;Y&gt; const &amp; r);
  5568. intrusive_ptr(intrusive_ptr &amp;&amp; r);
  5569. template&lt;class Y&gt; intrusive_ptr(intrusive_ptr&lt;Y&gt; &amp;&amp; r);
  5570. ~intrusive_ptr();
  5571. intrusive_ptr &amp; operator=(intrusive_ptr const &amp; r);
  5572. template&lt;class Y&gt; intrusive_ptr &amp; operator=(intrusive_ptr&lt;Y&gt; const &amp; r);
  5573. intrusive_ptr &amp; operator=(T * r);
  5574. intrusive_ptr &amp; operator=(intrusive_ptr &amp;&amp; r);
  5575. template&lt;class Y&gt; intrusive_ptr &amp; operator=(intrusive_ptr&lt;Y&gt; &amp;&amp; r);
  5576. void reset();
  5577. void reset(T * r);
  5578. void reset(T * r, bool add_ref);
  5579. T &amp; operator*() const noexcept;
  5580. T * operator-&gt;() const noexcept;
  5581. T * get() const noexcept;
  5582. T * detach() noexcept;
  5583. explicit operator bool () const noexcept;
  5584. void swap(intrusive_ptr &amp; b) noexcept;
  5585. };
  5586. template&lt;class T, class U&gt;
  5587. bool operator==(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;
  5588. template&lt;class T, class U&gt;
  5589. bool operator!=(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;
  5590. template&lt;class T, class U&gt;
  5591. bool operator==(intrusive_ptr&lt;T&gt; const &amp; a, U * b) noexcept;
  5592. template&lt;class T, class U&gt;
  5593. bool operator!=(intrusive_ptr&lt;T&gt; const &amp; a, U * b) noexcept;
  5594. template&lt;class T, class U&gt;
  5595. bool operator==(T * a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;
  5596. template&lt;class T, class U&gt;
  5597. bool operator!=(T * a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;
  5598. template&lt;class T&gt;
  5599. bool operator&lt;(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;T&gt; const &amp; b) noexcept;
  5600. template&lt;class T&gt; void swap(intrusive_ptr&lt;T&gt; &amp; a, intrusive_ptr&lt;T&gt; &amp; b) noexcept;
  5601. template&lt;class T&gt; T * get_pointer(intrusive_ptr&lt;T&gt; const &amp; p) noexcept;
  5602. template&lt;class T, class U&gt;
  5603. intrusive_ptr&lt;T&gt; static_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;
  5604. template&lt;class T, class U&gt;
  5605. intrusive_ptr&lt;T&gt; const_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;
  5606. template&lt;class T, class U&gt;
  5607. intrusive_ptr&lt;T&gt; dynamic_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;
  5608. template&lt;class E, class T, class Y&gt;
  5609. std::basic_ostream&lt;E, T&gt; &amp; operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os,
  5610. intrusive_ptr&lt;Y&gt; const &amp; p);
  5611. }</code></pre>
  5612. </div>
  5613. </div>
  5614. </div>
  5615. <div class="sect2">
  5616. <h3 id="intrusive_ptr_members">Members</h3>
  5617. <div class="sect3">
  5618. <h4 id="intrusive_ptr_element_type">element_type</h4>
  5619. <div class="listingblock">
  5620. <div class="content">
  5621. <pre class="highlight"><code>typedef T element_type;</code></pre>
  5622. </div>
  5623. </div>
  5624. <div class="paragraph">
  5625. <p>Provides the type of the template parameter T.</p>
  5626. </div>
  5627. </div>
  5628. <div class="sect3">
  5629. <h4 id="intrusive_ptr_constructors">constructors</h4>
  5630. <div class="listingblock">
  5631. <div class="content">
  5632. <pre class="highlight"><code>intrusive_ptr() noexcept;</code></pre>
  5633. </div>
  5634. </div>
  5635. <div class="ulist none">
  5636. <ul class="none">
  5637. <li>
  5638. <p></p>
  5639. <div class="dlist">
  5640. <dl>
  5641. <dt class="hdlist1">Postconditions</dt>
  5642. <dd>
  5643. <p><code>get() == 0</code>.</p>
  5644. </dd>
  5645. </dl>
  5646. </div>
  5647. </li>
  5648. </ul>
  5649. </div>
  5650. <div class="listingblock">
  5651. <div class="content">
  5652. <pre class="highlight"><code>intrusive_ptr(T * p, bool add_ref = true);</code></pre>
  5653. </div>
  5654. </div>
  5655. <div class="ulist none">
  5656. <ul class="none">
  5657. <li>
  5658. <p></p>
  5659. <div class="dlist">
  5660. <dl>
  5661. <dt class="hdlist1">Effects</dt>
  5662. <dd>
  5663. <p><code>if(p != 0 &amp;&amp; add_ref) intrusive_ptr_add_ref(p);</code>.</p>
  5664. </dd>
  5665. <dt class="hdlist1">Postconditions</dt>
  5666. <dd>
  5667. <p><code>get() == p</code>.</p>
  5668. </dd>
  5669. </dl>
  5670. </div>
  5671. </li>
  5672. </ul>
  5673. </div>
  5674. <div class="listingblock">
  5675. <div class="content">
  5676. <pre class="highlight"><code>intrusive_ptr(intrusive_ptr const &amp; r);</code></pre>
  5677. </div>
  5678. </div>
  5679. <div class="listingblock">
  5680. <div class="content">
  5681. <pre class="highlight"><code>template&lt;class Y&gt; intrusive_ptr(intrusive_ptr&lt;Y&gt; const &amp; r);</code></pre>
  5682. </div>
  5683. </div>
  5684. <div class="ulist none">
  5685. <ul class="none">
  5686. <li>
  5687. <p></p>
  5688. <div class="dlist">
  5689. <dl>
  5690. <dt class="hdlist1">Effects</dt>
  5691. <dd>
  5692. <p><code>T * p = r.get(); if(p != 0) intrusive_ptr_add_ref(p);</code>.</p>
  5693. </dd>
  5694. <dt class="hdlist1">Postconditions</dt>
  5695. <dd>
  5696. <p><code>get() == r.get()</code>.</p>
  5697. </dd>
  5698. </dl>
  5699. </div>
  5700. </li>
  5701. </ul>
  5702. </div>
  5703. <div class="listingblock">
  5704. <div class="content">
  5705. <pre class="highlight"><code>intrusive_ptr(intrusive_ptr &amp;&amp; r);</code></pre>
  5706. </div>
  5707. </div>
  5708. <div class="listingblock">
  5709. <div class="content">
  5710. <pre class="highlight"><code>template&lt;class Y&gt; intrusive_ptr(intrusive_ptr&lt;Y&gt; &amp;&amp; r);</code></pre>
  5711. </div>
  5712. </div>
  5713. <div class="ulist none">
  5714. <ul class="none">
  5715. <li>
  5716. <p></p>
  5717. <div class="dlist">
  5718. <dl>
  5719. <dt class="hdlist1">Postconditions</dt>
  5720. <dd>
  5721. <p><code>get()</code> equals the old value of <code>r.get()</code>. <code>r.get() == 0</code>.</p>
  5722. </dd>
  5723. </dl>
  5724. </div>
  5725. </li>
  5726. </ul>
  5727. </div>
  5728. </div>
  5729. <div class="sect3">
  5730. <h4 id="intrusive_ptr_destructor">destructor</h4>
  5731. <div class="listingblock">
  5732. <div class="content">
  5733. <pre class="highlight"><code>~intrusive_ptr();</code></pre>
  5734. </div>
  5735. </div>
  5736. <div class="ulist none">
  5737. <ul class="none">
  5738. <li>
  5739. <p></p>
  5740. <div class="dlist">
  5741. <dl>
  5742. <dt class="hdlist1">Effects</dt>
  5743. <dd>
  5744. <p><code>if(get() != 0) intrusive_ptr_release(get());</code>.</p>
  5745. </dd>
  5746. </dl>
  5747. </div>
  5748. </li>
  5749. </ul>
  5750. </div>
  5751. </div>
  5752. <div class="sect3">
  5753. <h4 id="intrusive_ptr_assignment">assignment</h4>
  5754. <div class="listingblock">
  5755. <div class="content">
  5756. <pre class="highlight"><code>intrusive_ptr &amp; operator=(intrusive_ptr const &amp; r);</code></pre>
  5757. </div>
  5758. </div>
  5759. <div class="listingblock">
  5760. <div class="content">
  5761. <pre class="highlight"><code>template&lt;class Y&gt; intrusive_ptr &amp; operator=(intrusive_ptr&lt;Y&gt; const &amp; r);</code></pre>
  5762. </div>
  5763. </div>
  5764. <div class="listingblock">
  5765. <div class="content">
  5766. <pre class="highlight"><code>intrusive_ptr &amp; operator=(T * r);</code></pre>
  5767. </div>
  5768. </div>
  5769. <div class="ulist none">
  5770. <ul class="none">
  5771. <li>
  5772. <p></p>
  5773. <div class="dlist">
  5774. <dl>
  5775. <dt class="hdlist1">Effects</dt>
  5776. <dd>
  5777. <p>Equivalent to <code>intrusive_ptr(r).swap(*this)</code>.</p>
  5778. </dd>
  5779. <dt class="hdlist1">Returns</dt>
  5780. <dd>
  5781. <p><code>*this</code>.</p>
  5782. </dd>
  5783. </dl>
  5784. </div>
  5785. </li>
  5786. </ul>
  5787. </div>
  5788. <div class="listingblock">
  5789. <div class="content">
  5790. <pre class="highlight"><code>intrusive_ptr &amp; operator=(intrusive_ptr &amp;&amp; r);</code></pre>
  5791. </div>
  5792. </div>
  5793. <div class="listingblock">
  5794. <div class="content">
  5795. <pre class="highlight"><code>template&lt;class Y&gt; intrusive_ptr &amp; operator=(intrusive_ptr&lt;Y&gt; &amp;&amp; r);</code></pre>
  5796. </div>
  5797. </div>
  5798. <div class="ulist none">
  5799. <ul class="none">
  5800. <li>
  5801. <p></p>
  5802. <div class="dlist">
  5803. <dl>
  5804. <dt class="hdlist1">Effects</dt>
  5805. <dd>
  5806. <p>Equivalent to <code>intrusive_ptr(std::move(r)).swap(*this)</code>.</p>
  5807. </dd>
  5808. <dt class="hdlist1">Returns</dt>
  5809. <dd>
  5810. <p><code>*this</code>.</p>
  5811. </dd>
  5812. </dl>
  5813. </div>
  5814. </li>
  5815. </ul>
  5816. </div>
  5817. </div>
  5818. <div class="sect3">
  5819. <h4 id="intrusive_ptr_reset">reset</h4>
  5820. <div class="listingblock">
  5821. <div class="content">
  5822. <pre class="highlight"><code>void reset();</code></pre>
  5823. </div>
  5824. </div>
  5825. <div class="ulist none">
  5826. <ul class="none">
  5827. <li>
  5828. <p></p>
  5829. <div class="dlist">
  5830. <dl>
  5831. <dt class="hdlist1">Effects</dt>
  5832. <dd>
  5833. <p>Equivalent to <code>intrusive_ptr().swap(*this)</code>.</p>
  5834. </dd>
  5835. </dl>
  5836. </div>
  5837. </li>
  5838. </ul>
  5839. </div>
  5840. <div class="listingblock">
  5841. <div class="content">
  5842. <pre class="highlight"><code>void reset(T * r);</code></pre>
  5843. </div>
  5844. </div>
  5845. <div class="ulist none">
  5846. <ul class="none">
  5847. <li>
  5848. <p></p>
  5849. <div class="dlist">
  5850. <dl>
  5851. <dt class="hdlist1">Effects</dt>
  5852. <dd>
  5853. <p>Equivalent to <code>intrusive_ptr(r).swap(*this)</code>.</p>
  5854. </dd>
  5855. </dl>
  5856. </div>
  5857. </li>
  5858. </ul>
  5859. </div>
  5860. <div class="listingblock">
  5861. <div class="content">
  5862. <pre class="highlight"><code>void reset(T * r, bool add_ref);</code></pre>
  5863. </div>
  5864. </div>
  5865. <div class="ulist none">
  5866. <ul class="none">
  5867. <li>
  5868. <p></p>
  5869. <div class="dlist">
  5870. <dl>
  5871. <dt class="hdlist1">Effects</dt>
  5872. <dd>
  5873. <p>Equivalent to <code>intrusive_ptr(r, add_ref).swap(*this)</code>.</p>
  5874. </dd>
  5875. </dl>
  5876. </div>
  5877. </li>
  5878. </ul>
  5879. </div>
  5880. </div>
  5881. <div class="sect3">
  5882. <h4 id="intrusive_ptr_indirection">indirection</h4>
  5883. <div class="listingblock">
  5884. <div class="content">
  5885. <pre class="highlight"><code>T &amp; operator*() const noexcept;</code></pre>
  5886. </div>
  5887. </div>
  5888. <div class="ulist none">
  5889. <ul class="none">
  5890. <li>
  5891. <p></p>
  5892. <div class="dlist">
  5893. <dl>
  5894. <dt class="hdlist1">Requirements</dt>
  5895. <dd>
  5896. <p><code>get() != 0</code>.</p>
  5897. </dd>
  5898. <dt class="hdlist1">Returns</dt>
  5899. <dd>
  5900. <p><code>*get()</code>.</p>
  5901. </dd>
  5902. </dl>
  5903. </div>
  5904. </li>
  5905. </ul>
  5906. </div>
  5907. <div class="listingblock">
  5908. <div class="content">
  5909. <pre class="highlight"><code>T * operator-&gt;() const noexcept;</code></pre>
  5910. </div>
  5911. </div>
  5912. <div class="ulist none">
  5913. <ul class="none">
  5914. <li>
  5915. <p></p>
  5916. <div class="dlist">
  5917. <dl>
  5918. <dt class="hdlist1">Requirements</dt>
  5919. <dd>
  5920. <p><code>get() != 0</code>.</p>
  5921. </dd>
  5922. <dt class="hdlist1">Returns</dt>
  5923. <dd>
  5924. <p><code>get()</code>.</p>
  5925. </dd>
  5926. </dl>
  5927. </div>
  5928. </li>
  5929. </ul>
  5930. </div>
  5931. </div>
  5932. <div class="sect3">
  5933. <h4 id="intrusive_ptr_get">get</h4>
  5934. <div class="listingblock">
  5935. <div class="content">
  5936. <pre class="highlight"><code>T * get() const noexcept;</code></pre>
  5937. </div>
  5938. </div>
  5939. <div class="ulist none">
  5940. <ul class="none">
  5941. <li>
  5942. <p></p>
  5943. <div class="dlist">
  5944. <dl>
  5945. <dt class="hdlist1">Returns</dt>
  5946. <dd>
  5947. <p>the stored pointer.</p>
  5948. </dd>
  5949. </dl>
  5950. </div>
  5951. </li>
  5952. </ul>
  5953. </div>
  5954. </div>
  5955. <div class="sect3">
  5956. <h4 id="intrusive_ptr_detach">detach</h4>
  5957. <div class="listingblock">
  5958. <div class="content">
  5959. <pre class="highlight"><code>T * detach() noexcept;</code></pre>
  5960. </div>
  5961. </div>
  5962. <div class="ulist none">
  5963. <ul class="none">
  5964. <li>
  5965. <p></p>
  5966. <div class="dlist">
  5967. <dl>
  5968. <dt class="hdlist1">Returns</dt>
  5969. <dd>
  5970. <p>the stored pointer.</p>
  5971. </dd>
  5972. <dt class="hdlist1">Postconditions</dt>
  5973. <dd>
  5974. <p><code>get() == 0</code>.</p>
  5975. </dd>
  5976. </dl>
  5977. </div>
  5978. </li>
  5979. </ul>
  5980. </div>
  5981. <div class="admonitionblock note">
  5982. <table>
  5983. <tr>
  5984. <td class="icon">
  5985. <div class="title">Note</div>
  5986. </td>
  5987. <td class="content">
  5988. The returned pointer has an elevated reference count. This allows conversion of an <code>intrusive_ptr</code>
  5989. back to a raw pointer, without the performance overhead of acquiring and dropping an extra reference.
  5990. It can be viewed as the complement of the non-reference-incrementing constructor.
  5991. </td>
  5992. </tr>
  5993. </table>
  5994. </div>
  5995. <div class="admonitionblock caution">
  5996. <table>
  5997. <tr>
  5998. <td class="icon">
  5999. <div class="title">Caution</div>
  6000. </td>
  6001. <td class="content">
  6002. Using <code>detach</code> escapes the safety of automatic reference counting provided by <code>intrusive_ptr</code>.
  6003. It should by used only where strictly necessary (such as when interfacing to an existing API), and when
  6004. the implications are thoroughly understood.
  6005. </td>
  6006. </tr>
  6007. </table>
  6008. </div>
  6009. </div>
  6010. <div class="sect3">
  6011. <h4 id="intrusive_ptr_conversions">conversions</h4>
  6012. <div class="listingblock">
  6013. <div class="content">
  6014. <pre class="highlight"><code>explicit operator bool () const noexcept;</code></pre>
  6015. </div>
  6016. </div>
  6017. <div class="ulist none">
  6018. <ul class="none">
  6019. <li>
  6020. <p></p>
  6021. <div class="dlist">
  6022. <dl>
  6023. <dt class="hdlist1">Returns</dt>
  6024. <dd>
  6025. <p><code>get() != 0</code>.</p>
  6026. </dd>
  6027. </dl>
  6028. </div>
  6029. </li>
  6030. </ul>
  6031. </div>
  6032. <div class="admonitionblock note">
  6033. <table>
  6034. <tr>
  6035. <td class="icon">
  6036. <div class="title">Note</div>
  6037. </td>
  6038. <td class="content">
  6039. This conversion operator allows <code>intrusive_ptr</code> objects to be used in boolean contexts,
  6040. like <code>if (p &amp;&amp; p-&gt;valid()) {}</code>.
  6041. </td>
  6042. </tr>
  6043. </table>
  6044. </div>
  6045. <div class="admonitionblock note">
  6046. <table>
  6047. <tr>
  6048. <td class="icon">
  6049. <div class="title">Note</div>
  6050. </td>
  6051. <td class="content">
  6052. On C++03 compilers, the return value is of an unspecified type.
  6053. </td>
  6054. </tr>
  6055. </table>
  6056. </div>
  6057. </div>
  6058. <div class="sect3">
  6059. <h4 id="intrusive_ptr_swap">swap</h4>
  6060. <div class="listingblock">
  6061. <div class="content">
  6062. <pre class="highlight"><code>void swap(intrusive_ptr &amp; b) noexcept;</code></pre>
  6063. </div>
  6064. </div>
  6065. <div class="ulist none">
  6066. <ul class="none">
  6067. <li>
  6068. <p></p>
  6069. <div class="dlist">
  6070. <dl>
  6071. <dt class="hdlist1">Effects</dt>
  6072. <dd>
  6073. <p>Exchanges the contents of the two smart pointers.</p>
  6074. </dd>
  6075. </dl>
  6076. </div>
  6077. </li>
  6078. </ul>
  6079. </div>
  6080. </div>
  6081. </div>
  6082. <div class="sect2">
  6083. <h3 id="intrusive_ptr_free_functions">Free Functions</h3>
  6084. <div class="sect3">
  6085. <h4 id="intrusive_ptr_comparison">comparison</h4>
  6086. <div class="listingblock">
  6087. <div class="content">
  6088. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6089. bool operator==(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  6090. </div>
  6091. </div>
  6092. <div class="ulist none">
  6093. <ul class="none">
  6094. <li>
  6095. <p></p>
  6096. <div class="dlist">
  6097. <dl>
  6098. <dt class="hdlist1">Returns</dt>
  6099. <dd>
  6100. <p><code>a.get() == b.get()</code>.</p>
  6101. </dd>
  6102. </dl>
  6103. </div>
  6104. </li>
  6105. </ul>
  6106. </div>
  6107. <div class="listingblock">
  6108. <div class="content">
  6109. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6110. bool operator!=(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  6111. </div>
  6112. </div>
  6113. <div class="ulist none">
  6114. <ul class="none">
  6115. <li>
  6116. <p></p>
  6117. <div class="dlist">
  6118. <dl>
  6119. <dt class="hdlist1">Returns</dt>
  6120. <dd>
  6121. <p><code>a.get() != b.get()</code>.</p>
  6122. </dd>
  6123. </dl>
  6124. </div>
  6125. </li>
  6126. </ul>
  6127. </div>
  6128. <div class="listingblock">
  6129. <div class="content">
  6130. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6131. bool operator==(intrusive_ptr&lt;T&gt; const &amp; a, U * b) noexcept;</code></pre>
  6132. </div>
  6133. </div>
  6134. <div class="ulist none">
  6135. <ul class="none">
  6136. <li>
  6137. <p></p>
  6138. <div class="dlist">
  6139. <dl>
  6140. <dt class="hdlist1">Returns</dt>
  6141. <dd>
  6142. <p><code>a.get() == b</code>.</p>
  6143. </dd>
  6144. </dl>
  6145. </div>
  6146. </li>
  6147. </ul>
  6148. </div>
  6149. <div class="listingblock">
  6150. <div class="content">
  6151. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6152. bool operator!=(intrusive_ptr&lt;T&gt; const &amp; a, U * b) noexcept;</code></pre>
  6153. </div>
  6154. </div>
  6155. <div class="ulist none">
  6156. <ul class="none">
  6157. <li>
  6158. <p></p>
  6159. <div class="dlist">
  6160. <dl>
  6161. <dt class="hdlist1">Returns</dt>
  6162. <dd>
  6163. <p><code>a.get() != b</code>.</p>
  6164. </dd>
  6165. </dl>
  6166. </div>
  6167. </li>
  6168. </ul>
  6169. </div>
  6170. <div class="listingblock">
  6171. <div class="content">
  6172. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6173. bool operator==(T * a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  6174. </div>
  6175. </div>
  6176. <div class="ulist none">
  6177. <ul class="none">
  6178. <li>
  6179. <p></p>
  6180. <div class="dlist">
  6181. <dl>
  6182. <dt class="hdlist1">Returns</dt>
  6183. <dd>
  6184. <p><code>a == b.get()</code>.</p>
  6185. </dd>
  6186. </dl>
  6187. </div>
  6188. </li>
  6189. </ul>
  6190. </div>
  6191. <div class="listingblock">
  6192. <div class="content">
  6193. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6194. bool operator!=(T * a, intrusive_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  6195. </div>
  6196. </div>
  6197. <div class="ulist none">
  6198. <ul class="none">
  6199. <li>
  6200. <p></p>
  6201. <div class="dlist">
  6202. <dl>
  6203. <dt class="hdlist1">Returns</dt>
  6204. <dd>
  6205. <p><code>a != b.get()</code>.</p>
  6206. </dd>
  6207. </dl>
  6208. </div>
  6209. </li>
  6210. </ul>
  6211. </div>
  6212. <div class="listingblock">
  6213. <div class="content">
  6214. <pre class="highlight"><code>template&lt;class T&gt;
  6215. bool operator&lt;(intrusive_ptr&lt;T&gt; const &amp; a, intrusive_ptr&lt;T&gt; const &amp; b) noexcept;</code></pre>
  6216. </div>
  6217. </div>
  6218. <div class="ulist none">
  6219. <ul class="none">
  6220. <li>
  6221. <p></p>
  6222. <div class="dlist">
  6223. <dl>
  6224. <dt class="hdlist1">Returns</dt>
  6225. <dd>
  6226. <p><code>std::less&lt;T *&gt;()(a.get(), b.get())</code>.</p>
  6227. </dd>
  6228. </dl>
  6229. </div>
  6230. </li>
  6231. </ul>
  6232. </div>
  6233. <div class="admonitionblock note">
  6234. <table>
  6235. <tr>
  6236. <td class="icon">
  6237. <div class="title">Note</div>
  6238. </td>
  6239. <td class="content">
  6240. Allows <code>intrusive_ptr</code> objects to be used as keys in associative containers.
  6241. </td>
  6242. </tr>
  6243. </table>
  6244. </div>
  6245. </div>
  6246. <div class="sect3">
  6247. <h4 id="intrusive_ptr_swap_2">swap</h4>
  6248. <div class="listingblock">
  6249. <div class="content">
  6250. <pre class="highlight"><code>template&lt;class T&gt; void swap(intrusive_ptr&lt;T&gt; &amp; a, intrusive_ptr&lt;T&gt; &amp; b) noexcept;</code></pre>
  6251. </div>
  6252. </div>
  6253. <div class="ulist none">
  6254. <ul class="none">
  6255. <li>
  6256. <p></p>
  6257. <div class="dlist">
  6258. <dl>
  6259. <dt class="hdlist1">Effects</dt>
  6260. <dd>
  6261. <p>Equivalent to <code>a.swap(b)</code>.</p>
  6262. </dd>
  6263. </dl>
  6264. </div>
  6265. </li>
  6266. </ul>
  6267. </div>
  6268. </div>
  6269. <div class="sect3">
  6270. <h4 id="intrusive_ptr_get_pointer">get_pointer</h4>
  6271. <div class="listingblock">
  6272. <div class="content">
  6273. <pre class="highlight"><code>template&lt;class T&gt; T * get_pointer(intrusive_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  6274. </div>
  6275. </div>
  6276. <div class="ulist none">
  6277. <ul class="none">
  6278. <li>
  6279. <p></p>
  6280. <div class="dlist">
  6281. <dl>
  6282. <dt class="hdlist1">Returns</dt>
  6283. <dd>
  6284. <p><code>p.get()</code>.</p>
  6285. </dd>
  6286. </dl>
  6287. </div>
  6288. </li>
  6289. </ul>
  6290. </div>
  6291. <div class="admonitionblock note">
  6292. <table>
  6293. <tr>
  6294. <td class="icon">
  6295. <div class="title">Note</div>
  6296. </td>
  6297. <td class="content">
  6298. Provided as an aid to generic programming. Used by <code>mem_fn</code>.
  6299. </td>
  6300. </tr>
  6301. </table>
  6302. </div>
  6303. </div>
  6304. <div class="sect3">
  6305. <h4 id="intrusive_ptr_static_pointer_cast">static_pointer_cast</h4>
  6306. <div class="listingblock">
  6307. <div class="content">
  6308. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6309. intrusive_ptr&lt;T&gt; static_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  6310. </div>
  6311. </div>
  6312. <div class="ulist none">
  6313. <ul class="none">
  6314. <li>
  6315. <p></p>
  6316. <div class="dlist">
  6317. <dl>
  6318. <dt class="hdlist1">Returns</dt>
  6319. <dd>
  6320. <p><code>intrusive_ptr&lt;T&gt;(static_cast&lt;T*&gt;(r.get()))</code>.</p>
  6321. </dd>
  6322. </dl>
  6323. </div>
  6324. </li>
  6325. </ul>
  6326. </div>
  6327. </div>
  6328. <div class="sect3">
  6329. <h4 id="intrusive_ptr_const_pointer_cast">const_pointer_cast</h4>
  6330. <div class="listingblock">
  6331. <div class="content">
  6332. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6333. intrusive_ptr&lt;T&gt; const_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  6334. </div>
  6335. </div>
  6336. <div class="ulist none">
  6337. <ul class="none">
  6338. <li>
  6339. <p></p>
  6340. <div class="dlist">
  6341. <dl>
  6342. <dt class="hdlist1">Returns</dt>
  6343. <dd>
  6344. <p><code>intrusive_ptr&lt;T&gt;(const_cast&lt;T*&gt;(r.get()))</code>.</p>
  6345. </dd>
  6346. </dl>
  6347. </div>
  6348. </li>
  6349. </ul>
  6350. </div>
  6351. </div>
  6352. <div class="sect3">
  6353. <h4 id="intrusive_ptr_dynamic_pointer_cast">dynamic_pointer_cast</h4>
  6354. <div class="listingblock">
  6355. <div class="content">
  6356. <pre class="highlight"><code>template&lt;class T, class U&gt;
  6357. intrusive_ptr&lt;T&gt; dynamic_pointer_cast(intrusive_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  6358. </div>
  6359. </div>
  6360. <div class="ulist none">
  6361. <ul class="none">
  6362. <li>
  6363. <p></p>
  6364. <div class="dlist">
  6365. <dl>
  6366. <dt class="hdlist1">Returns</dt>
  6367. <dd>
  6368. <p><code>intrusive_ptr&lt;T&gt;(dynamic_cast&lt;T*&gt;(r.get()))</code>.</p>
  6369. </dd>
  6370. </dl>
  6371. </div>
  6372. </li>
  6373. </ul>
  6374. </div>
  6375. </div>
  6376. <div class="sect3">
  6377. <h4 id="intrusive_ptr_operator">operator&lt;&lt;</h4>
  6378. <div class="listingblock">
  6379. <div class="content">
  6380. <pre class="highlight"><code>template&lt;class E, class T, class Y&gt;
  6381. std::basic_ostream&lt;E, T&gt; &amp; operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os,
  6382. intrusive_ptr&lt;Y&gt; const &amp; p);</code></pre>
  6383. </div>
  6384. </div>
  6385. <div class="ulist none">
  6386. <ul class="none">
  6387. <li>
  6388. <p></p>
  6389. <div class="dlist">
  6390. <dl>
  6391. <dt class="hdlist1">Effects</dt>
  6392. <dd>
  6393. <p><code>os &lt;&lt; p.get();</code>.</p>
  6394. </dd>
  6395. <dt class="hdlist1">Returns</dt>
  6396. <dd>
  6397. <p><code>os</code>.</p>
  6398. </dd>
  6399. </dl>
  6400. </div>
  6401. </li>
  6402. </ul>
  6403. </div>
  6404. </div>
  6405. </div>
  6406. </div>
  6407. </div>
  6408. <div class="sect1">
  6409. <h2 id="intrusive_ref_counter">intrusive_ref_counter</h2>
  6410. <div class="sectionbody">
  6411. <div class="sect2">
  6412. <h3 id="intrusive_ref_counter_description">Description</h3>
  6413. <div class="paragraph">
  6414. <p>The <code>intrusive_ref_counter</code> class template implements a reference counter for
  6415. a derived user&#8217;s class that is intended to be used with <code>intrusive_ptr</code>. The
  6416. base class has associated <code>intrusive_ptr_add_ref</code> and <code>intrusive_ptr_release</code>
  6417. functions which modify the reference counter as needed and destroy the user&#8217;s
  6418. object when the counter drops to zero.</p>
  6419. </div>
  6420. <div class="paragraph">
  6421. <p>The class template is parameterized on <code>Derived</code> and <code>CounterPolicy</code>
  6422. parameters. The first parameter is the user&#8217;s class that derives from
  6423. <code>intrusive_ref_counter</code>. This type is needed in order to destroy the object
  6424. correctly when there are no references to it left.</p>
  6425. </div>
  6426. <div class="paragraph">
  6427. <p>The second parameter is a policy that defines the nature of the reference
  6428. counter. The library provides two such policies: <code>thread_unsafe_counter</code> and
  6429. <code>thread_safe_counter</code>. The former instructs the <code>intrusive_ref_counter</code> base
  6430. class to use a counter only suitable for a single-threaded use. Pointers to a
  6431. single object that uses this kind of reference counter must not be used in
  6432. different threads. The latter policy makes the reference counter thread-safe,
  6433. unless the target platform doesn&#8217;t support threading. Since in modern systems
  6434. support for threading is common, the default counter policy is
  6435. <code>thread_safe_counter</code>.</p>
  6436. </div>
  6437. </div>
  6438. <div class="sect2">
  6439. <h3 id="intrusive_ref_counter_synopsis">Synopsis</h3>
  6440. <div class="paragraph">
  6441. <p><code>intrusive_ref_counter</code> is defined in
  6442. <code>&lt;boost/smart_ptr/intrusive_ref_counter.hpp&gt;</code>.</p>
  6443. </div>
  6444. <div class="listingblock">
  6445. <div class="content">
  6446. <pre class="highlight"><code>namespace boost {
  6447. struct thread_unsafe_counter;
  6448. struct thread_safe_counter;
  6449. template&lt;class Derived, class CounterPolicy = thread_safe_counter&gt;
  6450. class intrusive_ref_counter {
  6451. public:
  6452. intrusive_ref_counter() noexcept;
  6453. intrusive_ref_counter(const intrusive_ref_counter&amp; v) noexcept;
  6454. intrusive_ref_counter&amp; operator=(const intrusive_ref_counter&amp; v) noexcept;
  6455. unsigned int use_count() const noexcept;
  6456. protected:
  6457. ~intrusive_ref_counter() = default;
  6458. };
  6459. template&lt;class Derived, class CounterPolicy&gt;
  6460. void intrusive_ptr_add_ref(
  6461. const intrusive_ref_counter&lt;Derived, CounterPolicy&gt;* p) noexcept;
  6462. template&lt;class Derived, class CounterPolicy&gt;
  6463. void intrusive_ptr_release(
  6464. const intrusive_ref_counter&lt;Derived, CounterPolicy&gt;* p) noexcept;
  6465. }</code></pre>
  6466. </div>
  6467. </div>
  6468. </div>
  6469. <div class="sect2">
  6470. <h3 id="intrusive_ref_counter_members">Members</h3>
  6471. <div class="sect3">
  6472. <h4 id="intrusive_ref_counter_constructors">Constructors</h4>
  6473. <div class="listingblock">
  6474. <div class="content">
  6475. <pre class="highlight"><code>intrusive_ref_counter() noexcept;</code></pre>
  6476. </div>
  6477. </div>
  6478. <div class="listingblock">
  6479. <div class="content">
  6480. <pre class="highlight"><code>intrusive_ref_counter(const intrusive_ref_counter&amp;) noexcept;</code></pre>
  6481. </div>
  6482. </div>
  6483. <div class="ulist none">
  6484. <ul class="none">
  6485. <li>
  6486. <p></p>
  6487. <div class="dlist">
  6488. <dl>
  6489. <dt class="hdlist1">Postconditions</dt>
  6490. <dd>
  6491. <p><code>use_count() == 0</code>.</p>
  6492. </dd>
  6493. </dl>
  6494. </div>
  6495. </li>
  6496. </ul>
  6497. </div>
  6498. <div class="admonitionblock note">
  6499. <table>
  6500. <tr>
  6501. <td class="icon">
  6502. <div class="title">Note</div>
  6503. </td>
  6504. <td class="content">
  6505. The pointer to the constructed object is expected to be passed to
  6506. <code>intrusive_ptr</code> constructor, assignment operator or <code>reset</code> method, which
  6507. would increment the reference counter.
  6508. </td>
  6509. </tr>
  6510. </table>
  6511. </div>
  6512. </div>
  6513. <div class="sect3">
  6514. <h4 id="intrusive_ref_counter_destructor">Destructor</h4>
  6515. <div class="listingblock">
  6516. <div class="content">
  6517. <pre class="highlight"><code>~intrusive_ref_counter();</code></pre>
  6518. </div>
  6519. </div>
  6520. <div class="ulist none">
  6521. <ul class="none">
  6522. <li>
  6523. <p></p>
  6524. <div class="dlist">
  6525. <dl>
  6526. <dt class="hdlist1">Effects</dt>
  6527. <dd>
  6528. <p>Destroys the counter object.</p>
  6529. </dd>
  6530. </dl>
  6531. </div>
  6532. </li>
  6533. </ul>
  6534. </div>
  6535. <div class="admonitionblock note">
  6536. <table>
  6537. <tr>
  6538. <td class="icon">
  6539. <div class="title">Note</div>
  6540. </td>
  6541. <td class="content">
  6542. The destructor is protected so that the object can only be destroyed
  6543. through the <code>Derived</code> class.
  6544. </td>
  6545. </tr>
  6546. </table>
  6547. </div>
  6548. </div>
  6549. <div class="sect3">
  6550. <h4 id="intrusive_ref_counter_assignment">Assignment</h4>
  6551. <div class="listingblock">
  6552. <div class="content">
  6553. <pre class="highlight"><code>intrusive_ref_counter&amp; operator=(const intrusive_ref_counter&amp; v) noexcept;</code></pre>
  6554. </div>
  6555. </div>
  6556. <div class="ulist none">
  6557. <ul class="none">
  6558. <li>
  6559. <p></p>
  6560. <div class="dlist">
  6561. <dl>
  6562. <dt class="hdlist1">Effects</dt>
  6563. <dd>
  6564. <p>Does nothing, reference counter is not modified.</p>
  6565. </dd>
  6566. </dl>
  6567. </div>
  6568. </li>
  6569. </ul>
  6570. </div>
  6571. </div>
  6572. <div class="sect3">
  6573. <h4 id="intrusive_ref_counter_use_count">use_count</h4>
  6574. <div class="listingblock">
  6575. <div class="content">
  6576. <pre class="highlight"><code>unsigned int use_count() const noexcept;</code></pre>
  6577. </div>
  6578. </div>
  6579. <div class="ulist none">
  6580. <ul class="none">
  6581. <li>
  6582. <p></p>
  6583. <div class="dlist">
  6584. <dl>
  6585. <dt class="hdlist1">Returns</dt>
  6586. <dd>
  6587. <p>The current value of the reference counter.</p>
  6588. </dd>
  6589. </dl>
  6590. </div>
  6591. </li>
  6592. </ul>
  6593. </div>
  6594. <div class="admonitionblock note">
  6595. <table>
  6596. <tr>
  6597. <td class="icon">
  6598. <div class="title">Note</div>
  6599. </td>
  6600. <td class="content">
  6601. The returned value may not be actual in multi-threaded applications.
  6602. </td>
  6603. </tr>
  6604. </table>
  6605. </div>
  6606. </div>
  6607. </div>
  6608. <div class="sect2">
  6609. <h3 id="intrusive_ref_counter_free_functions">Free Functions</h3>
  6610. <div class="sect3">
  6611. <h4 id="intrusive_ref_counter_intrusive_ptr_add_ref">intrusive_ptr_add_ref</h4>
  6612. <div class="listingblock">
  6613. <div class="content">
  6614. <pre class="highlight"><code>template&lt;class Derived, class CounterPolicy&gt;
  6615. void intrusive_ptr_add_ref(
  6616. const intrusive_ref_counter&lt;Derived, CounterPolicy&gt;* p) noexcept;</code></pre>
  6617. </div>
  6618. </div>
  6619. <div class="ulist none">
  6620. <ul class="none">
  6621. <li>
  6622. <p></p>
  6623. <div class="dlist">
  6624. <dl>
  6625. <dt class="hdlist1">Effects</dt>
  6626. <dd>
  6627. <p>Increments the reference counter.</p>
  6628. </dd>
  6629. </dl>
  6630. </div>
  6631. </li>
  6632. </ul>
  6633. </div>
  6634. </div>
  6635. <div class="sect3">
  6636. <h4 id="intrusive_ref_counter_intrusive_ptr_release">intrusive_ptr_release</h4>
  6637. <div class="listingblock">
  6638. <div class="content">
  6639. <pre class="highlight"><code>template&lt;class Derived, class CounterPolicy&gt;
  6640. void intrusive_ptr_release(
  6641. const intrusive_ref_counter&lt;Derived, CounterPolicy&gt;* p) noexcept;</code></pre>
  6642. </div>
  6643. </div>
  6644. <div class="ulist none">
  6645. <ul class="none">
  6646. <li>
  6647. <p></p>
  6648. <div class="dlist">
  6649. <dl>
  6650. <dt class="hdlist1">Effects</dt>
  6651. <dd>
  6652. <p>Decrements the reference counter. If the reference counter reaches
  6653. 0, calls <code>delete static_cast&lt;const Derived*&gt;(p)</code>.</p>
  6654. </dd>
  6655. </dl>
  6656. </div>
  6657. </li>
  6658. </ul>
  6659. </div>
  6660. </div>
  6661. </div>
  6662. </div>
  6663. </div>
  6664. <div class="sect1">
  6665. <h2 id="local_shared_ptr">local_shared_ptr: Shared Ownership within a Single Thread</h2>
  6666. <div class="sectionbody">
  6667. <div class="sect2">
  6668. <h3 id="local_shared_ptr_description">Description</h3>
  6669. <div class="paragraph">
  6670. <p><code>local_shared_ptr</code> is nearly identical to <code>shared_ptr</code>, with the only difference of note being that its reference count is
  6671. updated with non-atomic operations. As such, a <code>local_shared_ptr</code> and all its copies must reside in (be local to) a single
  6672. thread (hence the name.)</p>
  6673. </div>
  6674. <div class="paragraph">
  6675. <p><code>local_shared_ptr</code> can be converted to <code>shared_ptr</code> and vice versa. Creating a <code>local_shared_ptr</code> from a <code>shared_ptr</code> creates
  6676. a new local reference count; this means that two <code>local_shared_ptr</code> instances, both created from the same <code>shared_ptr</code>, refer
  6677. to the same object but don&#8217;t share the same count, and as such, can safely be used by two different threads.</p>
  6678. </div>
  6679. <div class="listingblock">
  6680. <div class="title">Code Example 9. Two local_shared_ptr instances created from a shared_ptr</div>
  6681. <div class="content">
  6682. <pre class="highlight"><code>shared_ptr&lt;X&gt; p1( new X );
  6683. local_shared_ptr&lt;X&gt; p2( p1 ); // p2.local_use_count() == 1
  6684. local_shared_ptr&lt;X&gt; p3( p1 ); // p3.local_use_count() also 1</code></pre>
  6685. </div>
  6686. </div>
  6687. <div class="paragraph">
  6688. <p>Creating the second <code>local_shared_ptr</code> from the first one, however, does lead to the two sharing the same count:</p>
  6689. </div>
  6690. <div class="listingblock">
  6691. <div class="title">Code Example 10. A local_shared_ptr created from another local_shared_ptr</div>
  6692. <div class="content">
  6693. <pre class="highlight"><code>shared_ptr&lt;X&gt; p1( new X );
  6694. local_shared_ptr&lt;X&gt; p2( p1 ); // p2.local_use_count() == 1
  6695. local_shared_ptr&lt;X&gt; p3( p2 ); // p3.local_use_count() == 2</code></pre>
  6696. </div>
  6697. </div>
  6698. <div class="paragraph">
  6699. <p>Two <code>shared_ptr</code> instances created from the same <code>local_shared_ptr</code> do share ownership:</p>
  6700. </div>
  6701. <div class="listingblock">
  6702. <div class="title">Code Example 11. Two shared_ptr instances created from a local_shared_ptr</div>
  6703. <div class="content">
  6704. <pre class="highlight"><code>local_shared_ptr&lt;X&gt; p1( new X );
  6705. shared_ptr&lt;X&gt; p2( p1 ); // p2.use_count() == 2
  6706. shared_ptr&lt;X&gt; p3( p1 ); // p3.use_count() == 3</code></pre>
  6707. </div>
  6708. </div>
  6709. <div class="paragraph">
  6710. <p>Here <code>p2.use_count()</code> is 2, because <code>p1</code> holds a reference, too.</p>
  6711. </div>
  6712. <div class="paragraph">
  6713. <p>One can think of <code>local_shared_ptr&lt;T&gt;</code> as <code>shared_ptr&lt;shared_ptr&lt;T&gt;&gt;</code>, with the outer <code>shared_ptr</code> using non-atomic operations for
  6714. its count. Converting from <code>local_shared_ptr</code> to <code>shared_ptr</code> gives you a copy of the inner <code>shared_ptr</code>; converting from <code>shared_ptr</code>
  6715. wraps it into an outer <code>shared_ptr</code> with a non-atomic use count (conceptually speaking) and returns the result.</p>
  6716. </div>
  6717. </div>
  6718. <div class="sect2">
  6719. <h3 id="local_shared_ptr_synopsis">Synopsis</h3>
  6720. <div class="paragraph">
  6721. <p><code>local_shared_ptr</code> is defined in <code>&lt;boost/smart_ptr/local_shared_ptr.hpp&gt;</code>.</p>
  6722. </div>
  6723. <div class="listingblock">
  6724. <div class="content">
  6725. <pre class="highlight"><code>namespace boost {
  6726. template&lt;class T&gt; class local_shared_ptr {
  6727. public:
  6728. typedef /*see below*/ element_type;
  6729. // constructors
  6730. constexpr local_shared_ptr() noexcept;
  6731. constexpr local_shared_ptr(std::nullptr_t) noexcept;
  6732. template&lt;class Y&gt; explicit local_shared_ptr(Y * p);
  6733. template&lt;class Y, class D&gt; local_shared_ptr(Y * p, D d);
  6734. template&lt;class D&gt; local_shared_ptr(std::nullptr_t p, D d);
  6735. template&lt;class Y, class D, class A&gt; local_shared_ptr(Y * p, D d, A a);
  6736. template&lt;class D, class A&gt; local_shared_ptr(std::nullptr_t p, D d, A a);
  6737. local_shared_ptr(local_shared_ptr const &amp; r) noexcept;
  6738. template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  6739. local_shared_ptr(local_shared_ptr &amp;&amp; r) noexcept;
  6740. template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;
  6741. template&lt;class Y&gt; local_shared_ptr( shared_ptr&lt;Y&gt; const &amp; r );
  6742. template&lt;class Y&gt; local_shared_ptr( shared_ptr&lt;Y&gt; &amp;&amp; r );
  6743. template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  6744. template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;
  6745. template&lt;class Y, class D&gt; local_shared_ptr(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);
  6746. // destructor
  6747. ~local_shared_ptr() noexcept;
  6748. // assignment
  6749. local_shared_ptr &amp; operator=(local_shared_ptr const &amp; r) noexcept;
  6750. template&lt;class Y&gt; local_shared_ptr &amp; operator=(local_shared_ptr&lt;Y&gt; const &amp; r) noexcept;
  6751. local_shared_ptr &amp; operator=(local_shared_ptr const &amp;&amp; r) noexcept;
  6752. template&lt;class Y&gt; local_shared_ptr &amp; operator=(local_shared_ptr&lt;Y&gt; const &amp;&amp; r) noexcept;
  6753. template&lt;class Y, class D&gt; local_shared_ptr &amp; operator=(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);
  6754. local_shared_ptr &amp; operator=(std::nullptr_t) noexcept;
  6755. // reset
  6756. void reset() noexcept;
  6757. template&lt;class Y&gt; void reset(Y * p);
  6758. template&lt;class Y, class D&gt; void reset(Y * p, D d);
  6759. template&lt;class Y, class D, class A&gt; void reset(Y * p, D d, A a);
  6760. template&lt;class Y&gt; void reset(local_shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;
  6761. template&lt;class Y&gt; void reset(local_shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;
  6762. // accessors
  6763. T &amp; operator*() const noexcept; // only valid when T is not an array type
  6764. T * operator-&gt;() const noexcept; // only valid when T is not an array type
  6765. // only valid when T is an array type
  6766. element_type &amp; operator[](std::ptrdiff_t i) const noexcept;
  6767. element_type * get() const noexcept;
  6768. long local_use_count() const noexcept;
  6769. // conversions
  6770. explicit operator bool() const noexcept;
  6771. template&lt;class Y&gt; operator shared_ptr&lt;Y&gt;() const noexcept;
  6772. template&lt;class Y&gt; operator weak_ptr&lt;Y&gt;() const noexcept;
  6773. // swap
  6774. void swap(local_shared_ptr &amp; b) noexcept;
  6775. // owner_before
  6776. template&lt;class Y&gt; bool owner_before(local_shared_ptr&lt;Y&gt; const &amp; rhs) const noexcept;
  6777. };
  6778. // comparisons
  6779. template&lt;class T, class U&gt;
  6780. bool operator==(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6781. template&lt;class T, class U&gt;
  6782. bool operator==(local_shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6783. template&lt;class T, class U&gt;
  6784. bool operator==(shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6785. template&lt;class T, class U&gt;
  6786. bool operator!=(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6787. template&lt;class T, class U&gt;
  6788. bool operator!=(local_shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6789. template&lt;class T, class U&gt;
  6790. bool operator!=(shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6791. template&lt;class T&gt; bool operator==(local_shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;
  6792. template&lt;class T&gt; bool operator==(std::nullptr_t, local_shared_ptr&lt;T&gt; const &amp; p) noexcept;
  6793. template&lt;class T&gt; bool operator!=(local_shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;
  6794. template&lt;class T&gt; bool operator!=(std::nullptr_t, local_shared_ptr&lt;T&gt; const &amp; p) noexcept;
  6795. template&lt;class T, class U&gt;
  6796. bool operator&lt;(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;
  6797. // swap
  6798. template&lt;class T&gt; void swap(local_shared_ptr&lt;T&gt; &amp; a, local_shared_ptr&lt;T&gt; &amp; b) noexcept;
  6799. // get_pointer
  6800. template&lt;class T&gt;
  6801. typename local_shared_ptr&lt;T&gt;::element_type *
  6802. get_pointer(local_shared_ptr&lt;T&gt; const &amp; p) noexcept;
  6803. // casts
  6804. template&lt;class T, class U&gt;
  6805. local_shared_ptr&lt;T&gt; static_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;
  6806. template&lt;class T, class U&gt;
  6807. local_shared_ptr&lt;T&gt; const_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;
  6808. template&lt;class T, class U&gt;
  6809. local_shared_ptr&lt;T&gt; dynamic_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;
  6810. template&lt;class T, class U&gt;
  6811. local_shared_ptr&lt;T&gt; reinterpret_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;
  6812. // stream I/O
  6813. template&lt;class E, class T, class Y&gt;
  6814. std::basic_ostream&lt;E, T&gt; &amp;
  6815. operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os, local_shared_ptr&lt;Y&gt; const &amp; p);
  6816. // get_deleter
  6817. template&lt;class D, class T&gt; D * get_deleter(local_shared_ptr&lt;T&gt; const &amp; p) noexcept;
  6818. }</code></pre>
  6819. </div>
  6820. </div>
  6821. </div>
  6822. <div class="sect2">
  6823. <h3 id="local_shared_ptr_members">Members</h3>
  6824. <div class="sect3">
  6825. <h4 id="local_shared_ptr_element_type">element_type</h4>
  6826. <div class="listingblock">
  6827. <div class="content">
  6828. <pre class="highlight"><code>typedef ... element_type;</code></pre>
  6829. </div>
  6830. </div>
  6831. <div class="paragraph">
  6832. <p><code>element_type</code> is <code>T</code> when <code>T</code> is not an array type, and <code>U</code> when <code>T</code> is <code>U[]</code> or <code>U[N]</code>.</p>
  6833. </div>
  6834. </div>
  6835. <div class="sect3">
  6836. <h4 id="local_shared_ptr_default_constructor">default constructor</h4>
  6837. <div class="listingblock">
  6838. <div class="content">
  6839. <pre class="highlight"><code>constexpr local_shared_ptr() noexcept;</code></pre>
  6840. </div>
  6841. </div>
  6842. <div class="listingblock">
  6843. <div class="content">
  6844. <pre class="highlight"><code>constexpr local_shared_ptr(std::nullptr_t) noexcept;</code></pre>
  6845. </div>
  6846. </div>
  6847. <div class="ulist none">
  6848. <ul class="none">
  6849. <li>
  6850. <p></p>
  6851. <div class="dlist">
  6852. <dl>
  6853. <dt class="hdlist1">Effects</dt>
  6854. <dd>
  6855. <p>Constructs an empty <code>local_shared_ptr</code>.</p>
  6856. </dd>
  6857. <dt class="hdlist1">Postconditions</dt>
  6858. <dd>
  6859. <p><code>local_use_count() == 0 &amp;&amp; get() == 0</code>.</p>
  6860. </dd>
  6861. </dl>
  6862. </div>
  6863. </li>
  6864. </ul>
  6865. </div>
  6866. </div>
  6867. <div class="sect3">
  6868. <h4 id="local_shared_ptr_pointer_constructor">pointer constructor</h4>
  6869. <div class="listingblock">
  6870. <div class="content">
  6871. <pre class="highlight"><code>template&lt;class Y&gt; explicit local_shared_ptr(Y * p);</code></pre>
  6872. </div>
  6873. </div>
  6874. <div class="ulist none">
  6875. <ul class="none">
  6876. <li>
  6877. <p></p>
  6878. <div class="dlist">
  6879. <dl>
  6880. <dt class="hdlist1">Effects</dt>
  6881. <dd>
  6882. <p>Constructs a <code>local_shared_ptr</code> that owns <code>shared_ptr&lt;T&gt;( p )</code>.</p>
  6883. </dd>
  6884. <dt class="hdlist1">Postconditions</dt>
  6885. <dd>
  6886. <p><code>local_use_count() == 1 &amp;&amp; get() == p</code>.</p>
  6887. </dd>
  6888. <dt class="hdlist1">Throws</dt>
  6889. <dd>
  6890. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  6891. </dd>
  6892. </dl>
  6893. </div>
  6894. </li>
  6895. </ul>
  6896. </div>
  6897. </div>
  6898. <div class="sect3">
  6899. <h4 id="local_shared_ptr_constructors_taking_a_deleter">constructors taking a deleter</h4>
  6900. <div class="listingblock">
  6901. <div class="content">
  6902. <pre class="highlight"><code>template&lt;class Y, class D&gt; local_shared_ptr(Y * p, D d);</code></pre>
  6903. </div>
  6904. </div>
  6905. <div class="listingblock">
  6906. <div class="content">
  6907. <pre class="highlight"><code>template&lt;class D&gt; local_shared_ptr(std::nullptr_t p, D d);</code></pre>
  6908. </div>
  6909. </div>
  6910. <div class="ulist none">
  6911. <ul class="none">
  6912. <li>
  6913. <p></p>
  6914. <div class="dlist">
  6915. <dl>
  6916. <dt class="hdlist1">Effects</dt>
  6917. <dd>
  6918. <p>Constructs a <code>local_shared_ptr</code> that owns <code>shared_ptr&lt;T&gt;( p, d )</code>.</p>
  6919. </dd>
  6920. <dt class="hdlist1">Postconditions</dt>
  6921. <dd>
  6922. <p><code>local_use_count() == 1 &amp;&amp; get() == p</code>.</p>
  6923. </dd>
  6924. <dt class="hdlist1">Throws</dt>
  6925. <dd>
  6926. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  6927. </dd>
  6928. </dl>
  6929. </div>
  6930. </li>
  6931. </ul>
  6932. </div>
  6933. <div class="listingblock">
  6934. <div class="content">
  6935. <pre class="highlight"><code>template&lt;class Y, class D, class A&gt; local_shared_ptr(Y * p, D d, A a);</code></pre>
  6936. </div>
  6937. </div>
  6938. <div class="listingblock">
  6939. <div class="content">
  6940. <pre class="highlight"><code>template&lt;class D, class A&gt; local_shared_ptr(std::nullptr_t p, D d, A a);</code></pre>
  6941. </div>
  6942. </div>
  6943. <div class="ulist none">
  6944. <ul class="none">
  6945. <li>
  6946. <p></p>
  6947. <div class="dlist">
  6948. <dl>
  6949. <dt class="hdlist1">Effects</dt>
  6950. <dd>
  6951. <p>Constructs a <code>local_shared_ptr</code> that owns <code>shared_ptr&lt;T&gt;( p, d, a )</code>.</p>
  6952. </dd>
  6953. <dt class="hdlist1">Postconditions</dt>
  6954. <dd>
  6955. <p><code>local_use_count() == 1 &amp;&amp; get() == p</code>.</p>
  6956. </dd>
  6957. <dt class="hdlist1">Throws</dt>
  6958. <dd>
  6959. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  6960. </dd>
  6961. </dl>
  6962. </div>
  6963. </li>
  6964. </ul>
  6965. </div>
  6966. </div>
  6967. <div class="sect3">
  6968. <h4 id="local_shared_ptr_copy_and_converting_constructors">copy and converting constructors</h4>
  6969. <div class="listingblock">
  6970. <div class="content">
  6971. <pre class="highlight"><code>local_shared_ptr(local_shared_ptr const &amp; r) noexcept;</code></pre>
  6972. </div>
  6973. </div>
  6974. <div class="listingblock">
  6975. <div class="content">
  6976. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  6977. </div>
  6978. </div>
  6979. <div class="ulist none">
  6980. <ul class="none">
  6981. <li>
  6982. <p></p>
  6983. <div class="dlist">
  6984. <dl>
  6985. <dt class="hdlist1">Requires</dt>
  6986. <dd>
  6987. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  6988. </dd>
  6989. <dt class="hdlist1">Effects</dt>
  6990. <dd>
  6991. <p>If <code>r</code> is empty, constructs an empty <code>local_shared_ptr</code>; otherwise, constructs a <code>local_shared_ptr</code> that shares ownership with <code>r</code>.</p>
  6992. </dd>
  6993. <dt class="hdlist1">Postconditions</dt>
  6994. <dd>
  6995. <p><code>get() == r.get() &amp;&amp; local_use_count() == r.local_use_count()</code>.</p>
  6996. </dd>
  6997. </dl>
  6998. </div>
  6999. </li>
  7000. </ul>
  7001. </div>
  7002. </div>
  7003. <div class="sect3">
  7004. <h4 id="local_shared_ptr_move_constructors">move constructors</h4>
  7005. <div class="listingblock">
  7006. <div class="content">
  7007. <pre class="highlight"><code>local_shared_ptr(local_shared_ptr &amp;&amp; r) noexcept;</code></pre>
  7008. </div>
  7009. </div>
  7010. <div class="listingblock">
  7011. <div class="content">
  7012. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;</code></pre>
  7013. </div>
  7014. </div>
  7015. <div class="ulist none">
  7016. <ul class="none">
  7017. <li>
  7018. <p></p>
  7019. <div class="dlist">
  7020. <dl>
  7021. <dt class="hdlist1">Requires</dt>
  7022. <dd>
  7023. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  7024. </dd>
  7025. <dt class="hdlist1">Effects</dt>
  7026. <dd>
  7027. <p>Move-constructs a <code>local_shared_ptr</code> from <code>r</code>.</p>
  7028. </dd>
  7029. <dt class="hdlist1">Postconditions</dt>
  7030. <dd>
  7031. <p><code>*this</code> contains the old value of <code>r</code>. <code>r</code> is empty and <code>r.get() == 0</code>.</p>
  7032. </dd>
  7033. </dl>
  7034. </div>
  7035. </li>
  7036. </ul>
  7037. </div>
  7038. </div>
  7039. <div class="sect3">
  7040. <h4 id="local_shared_ptr_shared_ptr_constructor">shared_ptr constructor</h4>
  7041. <div class="listingblock">
  7042. <div class="content">
  7043. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr( shared_ptr&lt;Y&gt; const &amp; r );</code></pre>
  7044. </div>
  7045. </div>
  7046. <div class="listingblock">
  7047. <div class="content">
  7048. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr( shared_ptr&lt;Y&gt; &amp;&amp; r );</code></pre>
  7049. </div>
  7050. </div>
  7051. <div class="ulist none">
  7052. <ul class="none">
  7053. <li>
  7054. <p></p>
  7055. <div class="dlist">
  7056. <dl>
  7057. <dt class="hdlist1">Effects</dt>
  7058. <dd>
  7059. <p>Constructs a <code>local_shared_ptr</code> that owns <code>r</code>.</p>
  7060. </dd>
  7061. <dt class="hdlist1">Postconditions</dt>
  7062. <dd>
  7063. <p><code>local_use_count() == 1</code>. <code>get()</code> returns the old value of <code>r.get()</code>.</p>
  7064. </dd>
  7065. <dt class="hdlist1">Throws</dt>
  7066. <dd>
  7067. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  7068. </dd>
  7069. </dl>
  7070. </div>
  7071. </li>
  7072. </ul>
  7073. </div>
  7074. </div>
  7075. <div class="sect3">
  7076. <h4 id="local_shared_ptr_aliasing_constructor">aliasing constructor</h4>
  7077. <div class="listingblock">
  7078. <div class="content">
  7079. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  7080. </div>
  7081. </div>
  7082. <div class="ulist none">
  7083. <ul class="none">
  7084. <li>
  7085. <p></p>
  7086. <div class="dlist">
  7087. <dl>
  7088. <dt class="hdlist1">Effects</dt>
  7089. <dd>
  7090. <p>constructs a <code>local_shared_ptr</code> that shares ownership with <code>r</code> and stores <code>p</code>.</p>
  7091. </dd>
  7092. <dt class="hdlist1">Postconditions</dt>
  7093. <dd>
  7094. <p><code>get() == p &amp;&amp; local_use_count() == r.local_use_count()</code>.</p>
  7095. </dd>
  7096. </dl>
  7097. </div>
  7098. </li>
  7099. </ul>
  7100. </div>
  7101. </div>
  7102. <div class="sect3">
  7103. <h4 id="local_shared_ptr_aliasing_move_constructor">aliasing move constructor</h4>
  7104. <div class="listingblock">
  7105. <div class="content">
  7106. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr(local_shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;</code></pre>
  7107. </div>
  7108. </div>
  7109. <div class="ulist none">
  7110. <ul class="none">
  7111. <li>
  7112. <p></p>
  7113. <div class="dlist">
  7114. <dl>
  7115. <dt class="hdlist1">Effects</dt>
  7116. <dd>
  7117. <p>Move-constructs a <code>local_shared_ptr</code> from <code>r</code>, while storing <code>p</code> instead.</p>
  7118. </dd>
  7119. <dt class="hdlist1">Postconditions</dt>
  7120. <dd>
  7121. <p><code>get() == p</code> and <code>local_use_count()</code> equals the old count of <code>r</code>. <code>r</code> is empty and <code>r.get() == 0</code>.</p>
  7122. </dd>
  7123. </dl>
  7124. </div>
  7125. </li>
  7126. </ul>
  7127. </div>
  7128. </div>
  7129. <div class="sect3">
  7130. <h4 id="local_shared_ptr_unique_ptr_constructor">unique_ptr constructor</h4>
  7131. <div class="listingblock">
  7132. <div class="content">
  7133. <pre class="highlight"><code>template&lt;class Y, class D&gt; local_shared_ptr(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);</code></pre>
  7134. </div>
  7135. </div>
  7136. <div class="ulist none">
  7137. <ul class="none">
  7138. <li>
  7139. <p></p>
  7140. <div class="dlist">
  7141. <dl>
  7142. <dt class="hdlist1">Requires</dt>
  7143. <dd>
  7144. <p><code>Y*</code> should be convertible to <code>T*</code>.</p>
  7145. </dd>
  7146. <dt class="hdlist1">Effects</dt>
  7147. <dd>
  7148. <div class="ulist">
  7149. <ul>
  7150. <li>
  7151. <p>When <code>r.get() == 0</code>, equivalent to <code>local_shared_ptr()</code>;</p>
  7152. </li>
  7153. <li>
  7154. <p>Otherwise, constructs a <code>local_shared_ptr</code> that owns <code>shared_ptr&lt;T&gt;( std::move(r) )</code>.</p>
  7155. </li>
  7156. </ul>
  7157. </div>
  7158. </dd>
  7159. <dt class="hdlist1">Throws</dt>
  7160. <dd>
  7161. <p><code>std::bad_alloc</code>, or an implementation-defined exception when a resource other than memory could not be obtained.</p>
  7162. </dd>
  7163. <dt class="hdlist1">Exception safety</dt>
  7164. <dd>
  7165. <p>If an exception is thrown, the constructor has no effect.</p>
  7166. </dd>
  7167. </dl>
  7168. </div>
  7169. </li>
  7170. </ul>
  7171. </div>
  7172. </div>
  7173. <div class="sect3">
  7174. <h4 id="local_shared_ptr_destructor">destructor</h4>
  7175. <div class="listingblock">
  7176. <div class="content">
  7177. <pre class="highlight"><code>~local_shared_ptr() noexcept;</code></pre>
  7178. </div>
  7179. </div>
  7180. <div class="ulist none">
  7181. <ul class="none">
  7182. <li>
  7183. <p></p>
  7184. <div class="dlist">
  7185. <dl>
  7186. <dt class="hdlist1">Effects</dt>
  7187. <dd>
  7188. <div class="ulist">
  7189. <ul>
  7190. <li>
  7191. <p>If <code>*this</code> is empty, or shares ownership with another <code>local_shared_ptr</code> instance (<code>local_use_count() &gt; 1</code>), there are no side effects.</p>
  7192. </li>
  7193. <li>
  7194. <p>Otherwise, destroys the owned <code>shared_ptr</code>.</p>
  7195. </li>
  7196. </ul>
  7197. </div>
  7198. </dd>
  7199. </dl>
  7200. </div>
  7201. </li>
  7202. </ul>
  7203. </div>
  7204. </div>
  7205. <div class="sect3">
  7206. <h4 id="local_shared_ptr_assignment">assignment</h4>
  7207. <div class="listingblock">
  7208. <div class="content">
  7209. <pre class="highlight"><code>local_shared_ptr &amp; operator=(local_shared_ptr const &amp; r) noexcept;</code></pre>
  7210. </div>
  7211. </div>
  7212. <div class="listingblock">
  7213. <div class="content">
  7214. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr &amp; operator=(local_shared_ptr&lt;Y&gt; const &amp; r) noexcept;</code></pre>
  7215. </div>
  7216. </div>
  7217. <div class="ulist none">
  7218. <ul class="none">
  7219. <li>
  7220. <p></p>
  7221. <div class="dlist">
  7222. <dl>
  7223. <dt class="hdlist1">Effects</dt>
  7224. <dd>
  7225. <p>Equivalent to <code>local_shared_ptr(r).swap(*this)</code>.</p>
  7226. </dd>
  7227. <dt class="hdlist1">Returns</dt>
  7228. <dd>
  7229. <p><code>*this</code>.</p>
  7230. </dd>
  7231. </dl>
  7232. </div>
  7233. </li>
  7234. </ul>
  7235. </div>
  7236. <div class="listingblock">
  7237. <div class="content">
  7238. <pre class="highlight"><code>local_shared_ptr &amp; operator=(local_shared_ptr &amp;&amp; r) noexcept;</code></pre>
  7239. </div>
  7240. </div>
  7241. <div class="listingblock">
  7242. <div class="content">
  7243. <pre class="highlight"><code>template&lt;class Y&gt; local_shared_ptr &amp; operator=(local_shared_ptr&lt;Y&gt; &amp;&amp; r) noexcept;</code></pre>
  7244. </div>
  7245. </div>
  7246. <div class="listingblock">
  7247. <div class="content">
  7248. <pre class="highlight"><code>template&lt;class Y, class D&gt; local_shared_ptr &amp; operator=(std::unique_ptr&lt;Y, D&gt; &amp;&amp; r);</code></pre>
  7249. </div>
  7250. </div>
  7251. <div class="ulist none">
  7252. <ul class="none">
  7253. <li>
  7254. <p></p>
  7255. <div class="dlist">
  7256. <dl>
  7257. <dt class="hdlist1">Effects</dt>
  7258. <dd>
  7259. <p>Equivalent to <code>local_shared_ptr(std::move(r)).swap(*this)</code>.</p>
  7260. </dd>
  7261. <dt class="hdlist1">Returns</dt>
  7262. <dd>
  7263. <p><code>*this</code>.</p>
  7264. </dd>
  7265. </dl>
  7266. </div>
  7267. </li>
  7268. </ul>
  7269. </div>
  7270. <div class="listingblock">
  7271. <div class="content">
  7272. <pre class="highlight"><code>local_shared_ptr &amp; operator=(std::nullptr_t) noexcept;</code></pre>
  7273. </div>
  7274. </div>
  7275. <div class="ulist none">
  7276. <ul class="none">
  7277. <li>
  7278. <p></p>
  7279. <div class="dlist">
  7280. <dl>
  7281. <dt class="hdlist1">Effects</dt>
  7282. <dd>
  7283. <p>Equivalent to <code>local_shared_ptr().swap(*this)</code>.</p>
  7284. </dd>
  7285. <dt class="hdlist1">Returns</dt>
  7286. <dd>
  7287. <p><code>*this</code>.</p>
  7288. </dd>
  7289. </dl>
  7290. </div>
  7291. </li>
  7292. </ul>
  7293. </div>
  7294. </div>
  7295. <div class="sect3">
  7296. <h4 id="local_shared_ptr_reset">reset</h4>
  7297. <div class="listingblock">
  7298. <div class="content">
  7299. <pre class="highlight"><code>void reset() noexcept;</code></pre>
  7300. </div>
  7301. </div>
  7302. <div class="ulist none">
  7303. <ul class="none">
  7304. <li>
  7305. <p></p>
  7306. <div class="dlist">
  7307. <dl>
  7308. <dt class="hdlist1">Effects</dt>
  7309. <dd>
  7310. <p>Equivalent to <code>local_shared_ptr().swap(*this)</code>.</p>
  7311. </dd>
  7312. </dl>
  7313. </div>
  7314. </li>
  7315. </ul>
  7316. </div>
  7317. <div class="listingblock">
  7318. <div class="content">
  7319. <pre class="highlight"><code>template&lt;class Y&gt; void reset(Y * p);</code></pre>
  7320. </div>
  7321. </div>
  7322. <div class="ulist none">
  7323. <ul class="none">
  7324. <li>
  7325. <p></p>
  7326. <div class="dlist">
  7327. <dl>
  7328. <dt class="hdlist1">Effects</dt>
  7329. <dd>
  7330. <p>Equivalent to <code>local_shared_ptr(p).swap(*this)</code>.</p>
  7331. </dd>
  7332. </dl>
  7333. </div>
  7334. </li>
  7335. </ul>
  7336. </div>
  7337. <div class="listingblock">
  7338. <div class="content">
  7339. <pre class="highlight"><code>template&lt;class Y, class D&gt; void reset(Y * p, D d);</code></pre>
  7340. </div>
  7341. </div>
  7342. <div class="ulist none">
  7343. <ul class="none">
  7344. <li>
  7345. <p></p>
  7346. <div class="dlist">
  7347. <dl>
  7348. <dt class="hdlist1">Effects</dt>
  7349. <dd>
  7350. <p>Equivalent to <code>local_shared_ptr(p, d).swap(*this)</code>.</p>
  7351. </dd>
  7352. </dl>
  7353. </div>
  7354. </li>
  7355. </ul>
  7356. </div>
  7357. <div class="listingblock">
  7358. <div class="content">
  7359. <pre class="highlight"><code>template&lt;class Y, class D, class A&gt; void reset(Y * p, D d, A a);</code></pre>
  7360. </div>
  7361. </div>
  7362. <div class="ulist none">
  7363. <ul class="none">
  7364. <li>
  7365. <p></p>
  7366. <div class="dlist">
  7367. <dl>
  7368. <dt class="hdlist1">Effects</dt>
  7369. <dd>
  7370. <p>Equivalent to <code>local_shared_ptr(p, d, a).swap(*this)</code>.</p>
  7371. </dd>
  7372. </dl>
  7373. </div>
  7374. </li>
  7375. </ul>
  7376. </div>
  7377. <div class="listingblock">
  7378. <div class="content">
  7379. <pre class="highlight"><code>template&lt;class Y&gt; void reset(local_shared_ptr&lt;Y&gt; const &amp; r, element_type * p) noexcept;</code></pre>
  7380. </div>
  7381. </div>
  7382. <div class="ulist none">
  7383. <ul class="none">
  7384. <li>
  7385. <p></p>
  7386. <div class="dlist">
  7387. <dl>
  7388. <dt class="hdlist1">Effects</dt>
  7389. <dd>
  7390. <p>Equivalent to <code>local_shared_ptr(r, p).swap(*this)</code>.</p>
  7391. </dd>
  7392. </dl>
  7393. </div>
  7394. </li>
  7395. </ul>
  7396. </div>
  7397. <div class="listingblock">
  7398. <div class="content">
  7399. <pre class="highlight"><code>template&lt;class Y&gt; void reset(local_shared_ptr&lt;Y&gt; &amp;&amp; r, element_type * p) noexcept;</code></pre>
  7400. </div>
  7401. </div>
  7402. <div class="ulist none">
  7403. <ul class="none">
  7404. <li>
  7405. <p></p>
  7406. <div class="dlist">
  7407. <dl>
  7408. <dt class="hdlist1">Effects</dt>
  7409. <dd>
  7410. <p>Equivalent to <code>local_shared_ptr(std::move(r), p).swap(*this)</code>.</p>
  7411. </dd>
  7412. </dl>
  7413. </div>
  7414. </li>
  7415. </ul>
  7416. </div>
  7417. </div>
  7418. <div class="sect3">
  7419. <h4 id="local_shared_ptr_indirection">indirection</h4>
  7420. <div class="listingblock">
  7421. <div class="content">
  7422. <pre class="highlight"><code>T &amp; operator*() const noexcept;</code></pre>
  7423. </div>
  7424. </div>
  7425. <div class="ulist none">
  7426. <ul class="none">
  7427. <li>
  7428. <p></p>
  7429. <div class="dlist">
  7430. <dl>
  7431. <dt class="hdlist1">Requires</dt>
  7432. <dd>
  7433. <p><code>T</code> should not be an array type.</p>
  7434. </dd>
  7435. <dt class="hdlist1">Returns</dt>
  7436. <dd>
  7437. <p><code>*get()</code>.</p>
  7438. </dd>
  7439. </dl>
  7440. </div>
  7441. </li>
  7442. </ul>
  7443. </div>
  7444. <div class="listingblock">
  7445. <div class="content">
  7446. <pre class="highlight"><code>T * operator-&gt;() const noexcept;</code></pre>
  7447. </div>
  7448. </div>
  7449. <div class="ulist none">
  7450. <ul class="none">
  7451. <li>
  7452. <p></p>
  7453. <div class="dlist">
  7454. <dl>
  7455. <dt class="hdlist1">Requires</dt>
  7456. <dd>
  7457. <p><code>T</code> should not be an array type.</p>
  7458. </dd>
  7459. <dt class="hdlist1">Returns</dt>
  7460. <dd>
  7461. <p><code>get()</code>.</p>
  7462. </dd>
  7463. </dl>
  7464. </div>
  7465. </li>
  7466. </ul>
  7467. </div>
  7468. <div class="listingblock">
  7469. <div class="content">
  7470. <pre class="highlight"><code>element_type &amp; operator[](std::ptrdiff_t i) const noexcept;</code></pre>
  7471. </div>
  7472. </div>
  7473. <div class="ulist none">
  7474. <ul class="none">
  7475. <li>
  7476. <p></p>
  7477. <div class="dlist">
  7478. <dl>
  7479. <dt class="hdlist1">Requires</dt>
  7480. <dd>
  7481. <p><code>T</code> should be an array type. The stored pointer must not be 0. <code>i &gt;= 0</code>. If <code>T</code> is <code>U[N]</code>, <code>i &lt; N</code>.</p>
  7482. </dd>
  7483. <dt class="hdlist1">Returns</dt>
  7484. <dd>
  7485. <p><code>get()[i]</code>.</p>
  7486. </dd>
  7487. </dl>
  7488. </div>
  7489. </li>
  7490. </ul>
  7491. </div>
  7492. </div>
  7493. <div class="sect3">
  7494. <h4 id="local_shared_ptr_get">get</h4>
  7495. <div class="listingblock">
  7496. <div class="content">
  7497. <pre class="highlight"><code>element_type * get() const noexcept;</code></pre>
  7498. </div>
  7499. </div>
  7500. <div class="ulist none">
  7501. <ul class="none">
  7502. <li>
  7503. <p></p>
  7504. <div class="dlist">
  7505. <dl>
  7506. <dt class="hdlist1">Returns</dt>
  7507. <dd>
  7508. <p>The stored pointer.</p>
  7509. </dd>
  7510. </dl>
  7511. </div>
  7512. </li>
  7513. </ul>
  7514. </div>
  7515. </div>
  7516. <div class="sect3">
  7517. <h4 id="local_shared_ptr_local_use_count">local_use_count</h4>
  7518. <div class="listingblock">
  7519. <div class="content">
  7520. <pre class="highlight"><code>long local_use_count() const noexcept;</code></pre>
  7521. </div>
  7522. </div>
  7523. <div class="ulist none">
  7524. <ul class="none">
  7525. <li>
  7526. <p></p>
  7527. <div class="dlist">
  7528. <dl>
  7529. <dt class="hdlist1">Returns</dt>
  7530. <dd>
  7531. <p>The number of <code>local_shared_ptr</code> objects, <code>*this</code> included, that share ownership with <code>*this</code>, or 0 when <code>*this</code> is empty.</p>
  7532. </dd>
  7533. </dl>
  7534. </div>
  7535. </li>
  7536. </ul>
  7537. </div>
  7538. </div>
  7539. <div class="sect3">
  7540. <h4 id="local_shared_ptr_conversions">conversions</h4>
  7541. <div class="listingblock">
  7542. <div class="content">
  7543. <pre class="highlight"><code>explicit operator bool() const noexcept;</code></pre>
  7544. </div>
  7545. </div>
  7546. <div class="ulist none">
  7547. <ul class="none">
  7548. <li>
  7549. <p></p>
  7550. <div class="dlist">
  7551. <dl>
  7552. <dt class="hdlist1">Returns</dt>
  7553. <dd>
  7554. <p><code>get() != 0</code>.</p>
  7555. </dd>
  7556. </dl>
  7557. </div>
  7558. </li>
  7559. </ul>
  7560. </div>
  7561. <div class="admonitionblock note">
  7562. <table>
  7563. <tr>
  7564. <td class="icon">
  7565. <div class="title">Note</div>
  7566. </td>
  7567. <td class="content">
  7568. On C++03 compilers, the return value is of an unspecified type.
  7569. </td>
  7570. </tr>
  7571. </table>
  7572. </div>
  7573. <div class="listingblock">
  7574. <div class="content">
  7575. <pre class="highlight"><code>template&lt;class Y&gt; operator shared_ptr&lt;Y&gt;() const noexcept;</code></pre>
  7576. </div>
  7577. </div>
  7578. <div class="listingblock">
  7579. <div class="content">
  7580. <pre class="highlight"><code>template&lt;class Y&gt; operator weak_ptr&lt;Y&gt;() const noexcept;</code></pre>
  7581. </div>
  7582. </div>
  7583. <div class="ulist none">
  7584. <ul class="none">
  7585. <li>
  7586. <p></p>
  7587. <div class="dlist">
  7588. <dl>
  7589. <dt class="hdlist1">Requires</dt>
  7590. <dd>
  7591. <p><code>T*</code> should be convertible to <code>Y*</code>.</p>
  7592. </dd>
  7593. <dt class="hdlist1">Returns</dt>
  7594. <dd>
  7595. <p>a copy of the owned <code>shared_ptr</code>.</p>
  7596. </dd>
  7597. </dl>
  7598. </div>
  7599. </li>
  7600. </ul>
  7601. </div>
  7602. </div>
  7603. <div class="sect3">
  7604. <h4 id="local_shared_ptr_swap">swap</h4>
  7605. <div class="listingblock">
  7606. <div class="content">
  7607. <pre class="highlight"><code>void swap(local_shared_ptr &amp; b) noexcept;</code></pre>
  7608. </div>
  7609. </div>
  7610. <div class="ulist none">
  7611. <ul class="none">
  7612. <li>
  7613. <p></p>
  7614. <div class="dlist">
  7615. <dl>
  7616. <dt class="hdlist1">Effects</dt>
  7617. <dd>
  7618. <p>Exchanges the contents of the two smart pointers.</p>
  7619. </dd>
  7620. </dl>
  7621. </div>
  7622. </li>
  7623. </ul>
  7624. </div>
  7625. </div>
  7626. <div class="sect3">
  7627. <h4 id="local_shared_ptr_owner_before">owner_before</h4>
  7628. <div class="listingblock">
  7629. <div class="content">
  7630. <pre class="highlight"><code>template&lt;class Y&gt; bool owner_before(local_shared_ptr&lt;Y&gt; const &amp; rhs) const noexcept;</code></pre>
  7631. </div>
  7632. </div>
  7633. <div class="ulist none">
  7634. <ul class="none">
  7635. <li>
  7636. <p></p>
  7637. <div class="dlist">
  7638. <dl>
  7639. <dt class="hdlist1">Effects</dt>
  7640. <dd>
  7641. <p>See the description of <code>operator&lt;</code>.</p>
  7642. </dd>
  7643. </dl>
  7644. </div>
  7645. </li>
  7646. </ul>
  7647. </div>
  7648. </div>
  7649. </div>
  7650. <div class="sect2">
  7651. <h3 id="local_shared_ptr_free_functions">Free Functions</h3>
  7652. <div class="sect3">
  7653. <h4 id="local_shared_ptr_comparison">comparison</h4>
  7654. <div class="listingblock">
  7655. <div class="content">
  7656. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7657. bool operator==(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7658. </div>
  7659. </div>
  7660. <div class="listingblock">
  7661. <div class="content">
  7662. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7663. bool operator==(local_shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7664. </div>
  7665. </div>
  7666. <div class="listingblock">
  7667. <div class="content">
  7668. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7669. bool operator==(shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7670. </div>
  7671. </div>
  7672. <div class="ulist none">
  7673. <ul class="none">
  7674. <li>
  7675. <p></p>
  7676. <div class="dlist">
  7677. <dl>
  7678. <dt class="hdlist1">Returns</dt>
  7679. <dd>
  7680. <p><code>a.get() == b.get()</code>.</p>
  7681. </dd>
  7682. </dl>
  7683. </div>
  7684. </li>
  7685. </ul>
  7686. </div>
  7687. <div class="listingblock">
  7688. <div class="content">
  7689. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7690. bool operator!=(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7691. </div>
  7692. </div>
  7693. <div class="listingblock">
  7694. <div class="content">
  7695. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7696. bool operator!=(local_shared_ptr&lt;T&gt; const &amp; a, shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7697. </div>
  7698. </div>
  7699. <div class="listingblock">
  7700. <div class="content">
  7701. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7702. bool operator!=(shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7703. </div>
  7704. </div>
  7705. <div class="ulist none">
  7706. <ul class="none">
  7707. <li>
  7708. <p></p>
  7709. <div class="dlist">
  7710. <dl>
  7711. <dt class="hdlist1">Returns</dt>
  7712. <dd>
  7713. <p><code>a.get() != b.get()</code>.</p>
  7714. </dd>
  7715. </dl>
  7716. </div>
  7717. </li>
  7718. </ul>
  7719. </div>
  7720. <div class="listingblock">
  7721. <div class="content">
  7722. <pre class="highlight"><code>template&lt;class T&gt; bool operator==(local_shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;</code></pre>
  7723. </div>
  7724. </div>
  7725. <div class="listingblock">
  7726. <div class="content">
  7727. <pre class="highlight"><code>template&lt;class T&gt; bool operator==(std::nullptr_t, local_shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  7728. </div>
  7729. </div>
  7730. <div class="ulist none">
  7731. <ul class="none">
  7732. <li>
  7733. <p></p>
  7734. <div class="dlist">
  7735. <dl>
  7736. <dt class="hdlist1">Returns</dt>
  7737. <dd>
  7738. <p><code>p.get() == 0</code>.</p>
  7739. </dd>
  7740. </dl>
  7741. </div>
  7742. </li>
  7743. </ul>
  7744. </div>
  7745. <div class="listingblock">
  7746. <div class="content">
  7747. <pre class="highlight"><code>template&lt;class T&gt; bool operator!=(local_shared_ptr&lt;T&gt; const &amp; p, std::nullptr_t) noexcept;</code></pre>
  7748. </div>
  7749. </div>
  7750. <div class="listingblock">
  7751. <div class="content">
  7752. <pre class="highlight"><code>template&lt;class T&gt; bool operator!=(std::nullptr_t, local_shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  7753. </div>
  7754. </div>
  7755. <div class="ulist none">
  7756. <ul class="none">
  7757. <li>
  7758. <p></p>
  7759. <div class="dlist">
  7760. <dl>
  7761. <dt class="hdlist1">Returns</dt>
  7762. <dd>
  7763. <p><code>p.get() != 0</code>.</p>
  7764. </dd>
  7765. </dl>
  7766. </div>
  7767. </li>
  7768. </ul>
  7769. </div>
  7770. <div class="listingblock">
  7771. <div class="content">
  7772. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7773. bool operator&lt;(local_shared_ptr&lt;T&gt; const &amp; a, local_shared_ptr&lt;U&gt; const &amp; b) noexcept;</code></pre>
  7774. </div>
  7775. </div>
  7776. <div class="ulist none">
  7777. <ul class="none">
  7778. <li>
  7779. <p></p>
  7780. <div class="dlist">
  7781. <dl>
  7782. <dt class="hdlist1">Returns</dt>
  7783. <dd>
  7784. <p>An unspecified value such that</p>
  7785. <div class="ulist">
  7786. <ul>
  7787. <li>
  7788. <p><code>operator&lt;</code> is a strict weak ordering as described in section [lib.alg.sorting] of the C&#43;&#43; standard;</p>
  7789. </li>
  7790. <li>
  7791. <p>under the equivalence relation defined by <code>operator&lt;</code>, <code>!(a &lt; b) &amp;&amp; !(b &lt; a)</code>, two <code>local_shared_ptr</code> instances
  7792. are equivalent if and only if they share ownership or are both empty.</p>
  7793. </li>
  7794. </ul>
  7795. </div>
  7796. </dd>
  7797. </dl>
  7798. </div>
  7799. </li>
  7800. </ul>
  7801. </div>
  7802. <div class="admonitionblock note">
  7803. <table>
  7804. <tr>
  7805. <td class="icon">
  7806. <div class="title">Note</div>
  7807. </td>
  7808. <td class="content">
  7809. Allows <code>local_shared_ptr</code> objects to be used as keys in associative containers.
  7810. </td>
  7811. </tr>
  7812. </table>
  7813. </div>
  7814. <div class="admonitionblock note">
  7815. <table>
  7816. <tr>
  7817. <td class="icon">
  7818. <div class="title">Note</div>
  7819. </td>
  7820. <td class="content">
  7821. The rest of the comparison operators are omitted by design.
  7822. </td>
  7823. </tr>
  7824. </table>
  7825. </div>
  7826. </div>
  7827. <div class="sect3">
  7828. <h4 id="local_shared_ptr_swap_2">swap</h4>
  7829. <div class="listingblock">
  7830. <div class="content">
  7831. <pre class="highlight"><code>template&lt;class T&gt; void swap(local_shared_ptr&lt;T&gt; &amp; a, local_shared_ptr&lt;T&gt; &amp; b) noexcept;</code></pre>
  7832. </div>
  7833. </div>
  7834. <div class="ulist none">
  7835. <ul class="none">
  7836. <li>
  7837. <p></p>
  7838. <div class="dlist">
  7839. <dl>
  7840. <dt class="hdlist1">Effects</dt>
  7841. <dd>
  7842. <p>Equivalent to <code>a.swap(b)</code>.</p>
  7843. </dd>
  7844. </dl>
  7845. </div>
  7846. </li>
  7847. </ul>
  7848. </div>
  7849. </div>
  7850. <div class="sect3">
  7851. <h4 id="local_shared_ptr_get_pointer">get_pointer</h4>
  7852. <div class="listingblock">
  7853. <div class="content">
  7854. <pre class="highlight"><code>template&lt;class T&gt;
  7855. typename local_shared_ptr&lt;T&gt;::element_type *
  7856. get_pointer(local_shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  7857. </div>
  7858. </div>
  7859. <div class="ulist none">
  7860. <ul class="none">
  7861. <li>
  7862. <p></p>
  7863. <div class="dlist">
  7864. <dl>
  7865. <dt class="hdlist1">Returns</dt>
  7866. <dd>
  7867. <p><code>p.get()</code>.</p>
  7868. </dd>
  7869. </dl>
  7870. </div>
  7871. </li>
  7872. </ul>
  7873. </div>
  7874. <div class="admonitionblock note">
  7875. <table>
  7876. <tr>
  7877. <td class="icon">
  7878. <div class="title">Note</div>
  7879. </td>
  7880. <td class="content">
  7881. Provided as an aid to generic programming. Used by <code>mem_fn</code>.
  7882. </td>
  7883. </tr>
  7884. </table>
  7885. </div>
  7886. </div>
  7887. <div class="sect3">
  7888. <h4 id="local_shared_ptr_static_pointer_cast">static_pointer_cast</h4>
  7889. <div class="listingblock">
  7890. <div class="content">
  7891. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7892. local_shared_ptr&lt;T&gt; static_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  7893. </div>
  7894. </div>
  7895. <div class="ulist none">
  7896. <ul class="none">
  7897. <li>
  7898. <p></p>
  7899. <div class="dlist">
  7900. <dl>
  7901. <dt class="hdlist1">Requires</dt>
  7902. <dd>
  7903. <p>The expression <code>static_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  7904. </dd>
  7905. <dt class="hdlist1">Returns</dt>
  7906. <dd>
  7907. <p><code>local_shared_ptr&lt;T&gt;( r, static_cast&lt;typename local_shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  7908. </dd>
  7909. </dl>
  7910. </div>
  7911. </li>
  7912. </ul>
  7913. </div>
  7914. <div class="admonitionblock caution">
  7915. <table>
  7916. <tr>
  7917. <td class="icon">
  7918. <div class="title">Caution</div>
  7919. </td>
  7920. <td class="content">
  7921. The seemingly equivalent expression <code>local_shared_ptr&lt;T&gt;(static_cast&lt;T*&gt;(r.get()))</code> will eventually
  7922. result in undefined behavior, attempting to delete the same object twice.
  7923. </td>
  7924. </tr>
  7925. </table>
  7926. </div>
  7927. </div>
  7928. <div class="sect3">
  7929. <h4 id="local_shared_ptr_const_pointer_cast">const_pointer_cast</h4>
  7930. <div class="listingblock">
  7931. <div class="content">
  7932. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7933. local_shared_ptr&lt;T&gt; const_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  7934. </div>
  7935. </div>
  7936. <div class="ulist none">
  7937. <ul class="none">
  7938. <li>
  7939. <p></p>
  7940. <div class="dlist">
  7941. <dl>
  7942. <dt class="hdlist1">Requires</dt>
  7943. <dd>
  7944. <p>The expression <code>const_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  7945. </dd>
  7946. <dt class="hdlist1">Returns</dt>
  7947. <dd>
  7948. <p><code>local_shared_ptr&lt;T&gt;( r, const_cast&lt;typename local_shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  7949. </dd>
  7950. </dl>
  7951. </div>
  7952. </li>
  7953. </ul>
  7954. </div>
  7955. </div>
  7956. <div class="sect3">
  7957. <h4 id="local_shared_ptr_dynamic_pointer_cast">dynamic_pointer_cast</h4>
  7958. <div class="listingblock">
  7959. <div class="content">
  7960. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7961. local_shared_ptr&lt;T&gt; dynamic_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  7962. </div>
  7963. </div>
  7964. <div class="ulist none">
  7965. <ul class="none">
  7966. <li>
  7967. <p></p>
  7968. <div class="dlist">
  7969. <dl>
  7970. <dt class="hdlist1">Requires</dt>
  7971. <dd>
  7972. <p>The expression <code>dynamic_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  7973. </dd>
  7974. <dt class="hdlist1">Returns</dt>
  7975. <dd>
  7976. <div class="ulist">
  7977. <ul>
  7978. <li>
  7979. <p>When <code>dynamic_cast&lt;typename local_shared_ptr&lt;T&gt;::element_type*&gt;(r.get())</code> returns a nonzero value <code>p</code>, <code>local_shared_ptr&lt;T&gt;(r, p)</code>;</p>
  7980. </li>
  7981. <li>
  7982. <p>Otherwise, <code>local_shared_ptr&lt;T&gt;()</code>.</p>
  7983. </li>
  7984. </ul>
  7985. </div>
  7986. </dd>
  7987. </dl>
  7988. </div>
  7989. </li>
  7990. </ul>
  7991. </div>
  7992. </div>
  7993. <div class="sect3">
  7994. <h4 id="local_shared_ptr_reinterpret_pointer_cast">reinterpret_pointer_cast</h4>
  7995. <div class="listingblock">
  7996. <div class="content">
  7997. <pre class="highlight"><code>template&lt;class T, class U&gt;
  7998. local_shared_ptr&lt;T&gt; reinterpret_pointer_cast(local_shared_ptr&lt;U&gt; const &amp; r) noexcept;</code></pre>
  7999. </div>
  8000. </div>
  8001. <div class="ulist none">
  8002. <ul class="none">
  8003. <li>
  8004. <p></p>
  8005. <div class="dlist">
  8006. <dl>
  8007. <dt class="hdlist1">Requires</dt>
  8008. <dd>
  8009. <p>The expression <code>reinterpret_cast&lt;T*&gt;( (U*)0 )</code> must be well-formed.</p>
  8010. </dd>
  8011. <dt class="hdlist1">Returns</dt>
  8012. <dd>
  8013. <p><code>local_shared_ptr&lt;T&gt;( r, reinterpret_cast&lt;typename local_shared_ptr&lt;T&gt;::element_type*&gt;(r.get()) )</code>.</p>
  8014. </dd>
  8015. </dl>
  8016. </div>
  8017. </li>
  8018. </ul>
  8019. </div>
  8020. </div>
  8021. <div class="sect3">
  8022. <h4 id="local_shared_ptr_operator">operator&lt;&lt;</h4>
  8023. <div class="listingblock">
  8024. <div class="content">
  8025. <pre class="highlight"><code>template&lt;class E, class T, class Y&gt;
  8026. std::basic_ostream&lt;E, T&gt; &amp;
  8027. operator&lt;&lt; (std::basic_ostream&lt;E, T&gt; &amp; os, local_shared_ptr&lt;Y&gt; const &amp; p);</code></pre>
  8028. </div>
  8029. </div>
  8030. <div class="ulist none">
  8031. <ul class="none">
  8032. <li>
  8033. <p></p>
  8034. <div class="dlist">
  8035. <dl>
  8036. <dt class="hdlist1">Effects</dt>
  8037. <dd>
  8038. <p><code>os &lt;&lt; p.get();</code>.</p>
  8039. </dd>
  8040. <dt class="hdlist1">Returns</dt>
  8041. <dd>
  8042. <p><code>os</code>.</p>
  8043. </dd>
  8044. </dl>
  8045. </div>
  8046. </li>
  8047. </ul>
  8048. </div>
  8049. </div>
  8050. <div class="sect3">
  8051. <h4 id="local_shared_ptr_get_deleter">get_deleter</h4>
  8052. <div class="listingblock">
  8053. <div class="content">
  8054. <pre class="highlight"><code>template&lt;class D, class T&gt;
  8055. D * get_deleter(local_shared_ptr&lt;T&gt; const &amp; p) noexcept;</code></pre>
  8056. </div>
  8057. </div>
  8058. <div class="ulist none">
  8059. <ul class="none">
  8060. <li>
  8061. <p></p>
  8062. <div class="dlist">
  8063. <dl>
  8064. <dt class="hdlist1">Returns</dt>
  8065. <dd>
  8066. <p>If <code>*this</code> owns a <code>shared_ptr</code> instance <code>p</code>, <code>get_deleter&lt;D&gt;( p )</code>, otherwise 0.</p>
  8067. </dd>
  8068. </dl>
  8069. </div>
  8070. </li>
  8071. </ul>
  8072. </div>
  8073. </div>
  8074. </div>
  8075. </div>
  8076. </div>
  8077. <div class="sect1">
  8078. <h2 id="make_local_shared">make_local_shared: Creating local_shared_ptr</h2>
  8079. <div class="sectionbody">
  8080. <div class="sect2">
  8081. <h3 id="make_local_shared_description">Description</h3>
  8082. <div class="paragraph">
  8083. <p>The function templates <code>make_local_shared</code> and <code>allocate_local_shared</code> provide
  8084. convenient, safe and efficient ways to create <code>local_shared_ptr</code> objects. They
  8085. are analogous to <code>make_shared</code> and <code>allocate_shared</code> for <code>shared_ptr</code>.</p>
  8086. </div>
  8087. </div>
  8088. <div class="sect2">
  8089. <h3 id="make_local_shared_synopsis">Synopsis</h3>
  8090. <div class="paragraph">
  8091. <p><code>make_local_shared</code> and <code>allocate_local_shared</code> are defined in
  8092. <code>&lt;boost/smart_ptr/make_local_shared.hpp&gt;</code>.</p>
  8093. </div>
  8094. <div class="listingblock">
  8095. <div class="content">
  8096. <pre class="highlight"><code>namespace boost {
  8097. <code>// T is not an array</code>
  8098. template&lt;class T, class... Args&gt;
  8099. local_shared_ptr&lt;T&gt; make_local_shared(Args&amp;&amp;... args);
  8100. template&lt;class T, class A, class... Args&gt;
  8101. local_shared_ptr&lt;T&gt; allocate_local_shared(const A&amp; a, Args&amp;&amp;... args);
  8102. <code>// T is an array of unknown bounds</code>
  8103. template&lt;class T&gt;
  8104. local_shared_ptr&lt;T&gt; make_local_shared(std::size_t n);
  8105. template&lt;class T, class A&gt;
  8106. local_shared_ptr&lt;T&gt; allocate_local_shared(const A&amp; a, std::size_t n);
  8107. <code>// T is an array of known bounds</code>
  8108. template&lt;class T&gt;
  8109. local_shared_ptr&lt;T&gt; make_local_shared();
  8110. template&lt;class T, class A&gt;
  8111. local_shared_ptr&lt;T&gt; allocate_local_shared(const A&amp; a);
  8112. <code>// T is an array of unknown bounds</code>
  8113. template&lt;class T&gt;
  8114. local_shared_ptr&lt;T&gt; make_local_shared(std::size_t n,
  8115. const remove_extent_t&lt;T&gt;&amp; v);
  8116. template&lt;class T, class A&gt;
  8117. local_shared_ptr&lt;T&gt; allocate_local_shared(const A&amp; a, std::size_t n,
  8118. const remove_extent_t&lt;T&gt;&amp; v);
  8119. <code>// T is an array of known bounds</code>
  8120. template&lt;class T&gt;
  8121. local_shared_ptr&lt;T&gt; make_local_shared(const remove_extent_t&lt;T&gt;&amp; v);
  8122. template&lt;class T, class A&gt;
  8123. local_shared_ptr&lt;T&gt; allocate_local_shared(const A&amp; a,
  8124. const remove_extent_t&lt;T&gt;&amp; v);
  8125. <code>// T is not an array of known bounds</code>
  8126. template&lt;class T&gt;
  8127. local_shared_ptr&lt;T&gt; make_local_shared_noinit();
  8128. template&lt;class T, class A&gt;
  8129. local_shared_ptr&lt;T&gt; allocate_local_shared_noinit(const A&amp; a);
  8130. <code>// T is an array of unknown bounds</code>
  8131. template&lt;class T&gt;
  8132. local_shared_ptr&lt;T&gt; make_local_shared_noinit(std::size_t n);
  8133. template&lt;class T, class A&gt;
  8134. local_shared_ptr&lt;T&gt; allocate_local_shared_noinit(const A&amp; a,
  8135. std::size_t n);
  8136. }</code></pre>
  8137. </div>
  8138. </div>
  8139. </div>
  8140. <div class="sect2">
  8141. <h3 id="make_local_shared_description_2">Description</h3>
  8142. <div class="paragraph">
  8143. <p>The requirements and effects of these functions are the same as <code>make_shared</code>
  8144. and <code>allocate_shared</code>, except that a <code>local_shared_ptr</code> is returned.</p>
  8145. </div>
  8146. </div>
  8147. </div>
  8148. </div>
  8149. <div class="sect1">
  8150. <h2 id="pointer_cast">Generic Pointer Casts</h2>
  8151. <div class="sectionbody">
  8152. <div class="sect2">
  8153. <h3 id="pointer_cast_description">Description</h3>
  8154. <div class="paragraph">
  8155. <p>The pointer cast function templates (<code>static_pointer_cast</code>,
  8156. <code>dynamic_pointer_cast</code>, <code>const_pointer_cast</code>, and <code>reinterpret_pointer_cast</code>)
  8157. provide a way to write generic pointer castings for raw pointers,
  8158. <code>std::shared_ptr</code> and <code>std::unique_ptr</code>.</p>
  8159. </div>
  8160. <div class="paragraph">
  8161. <p>There is test and example code in
  8162. <a href="../../test/pointer_cast_test.cpp">pointer_cast_test.cpp</a></p>
  8163. </div>
  8164. </div>
  8165. <div class="sect2">
  8166. <h3 id="pointer_cast_rationale">Rationale</h3>
  8167. <div class="paragraph">
  8168. <p>Boost smart pointers usually overload those functions to provide a mechanism
  8169. to emulate pointers casts. For example, <code>shared_ptr&lt;T&gt;</code> implements a static
  8170. pointer cast this way:</p>
  8171. </div>
  8172. <div class="listingblock">
  8173. <div class="content">
  8174. <pre class="highlight"><code>template&lt;class T, class U&gt;
  8175. shared_ptr&lt;T&gt; static_pointer_cast(const shared_ptr&lt;U&gt;&amp; p);</code></pre>
  8176. </div>
  8177. </div>
  8178. <div class="paragraph">
  8179. <p>Pointer cast functions templates are overloads of <code>static_pointer_cast</code>,
  8180. <code>dynamic_pointer_cast</code>, <code>const_pointer_cast</code>, and <code>reinterpret_pointer_cast</code>
  8181. for raw pointers, <code>std::shared_ptr</code> and <code>std::unique_ptr</code>. This way when
  8182. developing pointer type independent classes, for example, memory managers or
  8183. shared memory compatible classes, the same code can be used for raw and smart
  8184. pointers.</p>
  8185. </div>
  8186. </div>
  8187. <div class="sect2">
  8188. <h3 id="pointer_cast_synopsis">Synopsis</h3>
  8189. <div class="paragraph">
  8190. <p>The generic pointer casts are defined in <code>&lt;boost/pointer_cast.hpp&gt;</code>.</p>
  8191. </div>
  8192. <div class="listingblock">
  8193. <div class="content">
  8194. <pre class="highlight"><code>namespace boost {
  8195. template&lt;class T, class U&gt; T* static_pointer_cast(U* p) noexcept;
  8196. template&lt;class T, class U&gt; T* dynamic_pointer_cast(U* p) noexcept;
  8197. template&lt;class T, class U&gt; T* const_pointer_cast(U* p) noexcept;
  8198. template&lt;class T, class U&gt; T* reinterpret_pointer_cast(U* p) noexcept;
  8199. template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8200. static_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;
  8201. template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8202. dynamic_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;
  8203. template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8204. const_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;
  8205. template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8206. reinterpret_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;
  8207. template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8208. static_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;
  8209. template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8210. dynamic_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;
  8211. template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8212. const_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;
  8213. template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8214. reinterpret_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;
  8215. }</code></pre>
  8216. </div>
  8217. </div>
  8218. </div>
  8219. <div class="sect2">
  8220. <h3 id="pointer_cast_free_functions">Free Functions</h3>
  8221. <div class="sect3">
  8222. <h4 id="pointer_cast_static_pointer_cast">static_pointer_cast</h4>
  8223. <div class="listingblock">
  8224. <div class="content">
  8225. <pre class="highlight"><code>template&lt;class T, class U&gt; T* static_pointer_cast(U* p) noexcept;</code></pre>
  8226. </div>
  8227. </div>
  8228. <div class="ulist none">
  8229. <ul class="none">
  8230. <li>
  8231. <p></p>
  8232. <div class="dlist">
  8233. <dl>
  8234. <dt class="hdlist1">Returns</dt>
  8235. <dd>
  8236. <p><code>static_cast&lt;T*&gt;(p)</code></p>
  8237. </dd>
  8238. </dl>
  8239. </div>
  8240. </li>
  8241. </ul>
  8242. </div>
  8243. <div class="listingblock">
  8244. <div class="content">
  8245. <pre class="highlight"><code>template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8246. static_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;</code></pre>
  8247. </div>
  8248. </div>
  8249. <div class="ulist none">
  8250. <ul class="none">
  8251. <li>
  8252. <p></p>
  8253. <div class="dlist">
  8254. <dl>
  8255. <dt class="hdlist1">Returns</dt>
  8256. <dd>
  8257. <p><code>std::static_pointer_cast&lt;T&gt;(p)</code></p>
  8258. </dd>
  8259. </dl>
  8260. </div>
  8261. </li>
  8262. </ul>
  8263. </div>
  8264. <div class="listingblock">
  8265. <div class="content">
  8266. <pre class="highlight"><code>template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8267. static_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;</code></pre>
  8268. </div>
  8269. </div>
  8270. <div class="ulist none">
  8271. <ul class="none">
  8272. <li>
  8273. <p></p>
  8274. <div class="dlist">
  8275. <dl>
  8276. <dt class="hdlist1">Requires</dt>
  8277. <dd>
  8278. <p>The expression <code>static_cast&lt;T*&gt;((U*)0)</code> must be well-formed.</p>
  8279. </dd>
  8280. <dt class="hdlist1">Returns</dt>
  8281. <dd>
  8282. <p><code>std::unique_ptr&lt;T&gt;(static_cast&lt;typename
  8283. std::unique_ptr&lt;T&gt;::element_type*&gt;(p.release()))</code>.</p>
  8284. </dd>
  8285. </dl>
  8286. </div>
  8287. </li>
  8288. </ul>
  8289. </div>
  8290. <div class="admonitionblock caution">
  8291. <table>
  8292. <tr>
  8293. <td class="icon">
  8294. <div class="title">Caution</div>
  8295. </td>
  8296. <td class="content">
  8297. The seemingly equivalent expression
  8298. <code>std::unique_ptr&lt;T&gt;(static_cast&lt;T*&gt;(p.get()))</code> will eventually result in
  8299. undefined behavior, attempting to delete the same object twice.
  8300. </td>
  8301. </tr>
  8302. </table>
  8303. </div>
  8304. </div>
  8305. <div class="sect3">
  8306. <h4 id="pointer_cast_dynamic_pointer_cast">dynamic_pointer_cast</h4>
  8307. <div class="listingblock">
  8308. <div class="content">
  8309. <pre class="highlight"><code>template&lt;class T, class U&gt; T* dynamic_pointer_cast(U* p) noexcept;</code></pre>
  8310. </div>
  8311. </div>
  8312. <div class="ulist none">
  8313. <ul class="none">
  8314. <li>
  8315. <p></p>
  8316. <div class="dlist">
  8317. <dl>
  8318. <dt class="hdlist1">Returns</dt>
  8319. <dd>
  8320. <p><code>dynamic_cast&lt;T*&gt;(p)</code></p>
  8321. </dd>
  8322. </dl>
  8323. </div>
  8324. </li>
  8325. </ul>
  8326. </div>
  8327. <div class="listingblock">
  8328. <div class="content">
  8329. <pre class="highlight"><code>template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8330. dynamic_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;</code></pre>
  8331. </div>
  8332. </div>
  8333. <div class="ulist none">
  8334. <ul class="none">
  8335. <li>
  8336. <p></p>
  8337. <div class="dlist">
  8338. <dl>
  8339. <dt class="hdlist1">Returns</dt>
  8340. <dd>
  8341. <p><code>std::dynamic_pointer_cast&lt;T&gt;(p)</code></p>
  8342. </dd>
  8343. </dl>
  8344. </div>
  8345. </li>
  8346. </ul>
  8347. </div>
  8348. <div class="listingblock">
  8349. <div class="content">
  8350. <pre class="highlight"><code>template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8351. dynamic_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;</code></pre>
  8352. </div>
  8353. </div>
  8354. <div class="ulist none">
  8355. <ul class="none">
  8356. <li>
  8357. <p></p>
  8358. <div class="dlist">
  8359. <dl>
  8360. <dt class="hdlist1">Requires</dt>
  8361. </dl>
  8362. </div>
  8363. </li>
  8364. <li>
  8365. <p>The expression <code>static_cast&lt;T*&gt;((U*)0)</code> must be well-formed.</p>
  8366. </li>
  8367. <li>
  8368. <p><code>T</code> must have a virtual destructor.</p>
  8369. <div class="dlist">
  8370. <dl>
  8371. <dt class="hdlist1">Returns</dt>
  8372. </dl>
  8373. </div>
  8374. </li>
  8375. <li>
  8376. <p>When <code>dynamic_cast&lt;typename std::unique_ptr&lt;T&gt;::element_type*&gt;(p.get())</code>
  8377. returns a non-zero value, <code>std::unique_ptr&lt;T&gt;(dynamic_cast&lt;typename
  8378. std::unique_ptr&lt;T&gt;::element_type*&gt;(p.release()));</code>.</p>
  8379. </li>
  8380. <li>
  8381. <p>Otherwise, <code>std::unique_ptr&lt;T&gt;()</code>.</p>
  8382. </li>
  8383. </ul>
  8384. </div>
  8385. </div>
  8386. <div class="sect3">
  8387. <h4 id="pointer_cast_const_pointer_cast">const_pointer_cast</h4>
  8388. <div class="listingblock">
  8389. <div class="content">
  8390. <pre class="highlight"><code>template&lt;class T, class U&gt; T* const_pointer_cast(U* p) noexcept;</code></pre>
  8391. </div>
  8392. </div>
  8393. <div class="ulist none">
  8394. <ul class="none">
  8395. <li>
  8396. <p></p>
  8397. <div class="dlist">
  8398. <dl>
  8399. <dt class="hdlist1">Returns</dt>
  8400. <dd>
  8401. <p><code>const_cast&lt;T*&gt;(p)</code></p>
  8402. </dd>
  8403. </dl>
  8404. </div>
  8405. </li>
  8406. </ul>
  8407. </div>
  8408. <div class="listingblock">
  8409. <div class="content">
  8410. <pre class="highlight"><code>template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8411. const_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;</code></pre>
  8412. </div>
  8413. </div>
  8414. <div class="ulist none">
  8415. <ul class="none">
  8416. <li>
  8417. <p></p>
  8418. <div class="dlist">
  8419. <dl>
  8420. <dt class="hdlist1">Returns</dt>
  8421. <dd>
  8422. <p><code>std::const_pointer_cast&lt;T&gt;(p)</code></p>
  8423. </dd>
  8424. </dl>
  8425. </div>
  8426. </li>
  8427. </ul>
  8428. </div>
  8429. <div class="listingblock">
  8430. <div class="content">
  8431. <pre class="highlight"><code>template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8432. const_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;</code></pre>
  8433. </div>
  8434. </div>
  8435. <div class="ulist none">
  8436. <ul class="none">
  8437. <li>
  8438. <p></p>
  8439. <div class="dlist">
  8440. <dl>
  8441. <dt class="hdlist1">Requires</dt>
  8442. <dd>
  8443. <p>The expression <code>const_cast&lt;T*&gt;((U*)0)</code> must be well-formed.</p>
  8444. </dd>
  8445. <dt class="hdlist1">Returns</dt>
  8446. <dd>
  8447. <p><code>std::unique_ptr&lt;T&gt;(const_cast&lt;typename
  8448. std::unique_ptr&lt;T&gt;::element_type*&gt;(p.release()))</code>.</p>
  8449. </dd>
  8450. </dl>
  8451. </div>
  8452. </li>
  8453. </ul>
  8454. </div>
  8455. </div>
  8456. <div class="sect3">
  8457. <h4 id="pointer_cast_reinterpret_pointer_cast">reinterpret_pointer_cast</h4>
  8458. <div class="listingblock">
  8459. <div class="content">
  8460. <pre class="highlight"><code>template&lt;class T, class U&gt; T* reinterpret_pointer_cast(U* p) noexcept;</code></pre>
  8461. </div>
  8462. </div>
  8463. <div class="ulist none">
  8464. <ul class="none">
  8465. <li>
  8466. <p></p>
  8467. <div class="dlist">
  8468. <dl>
  8469. <dt class="hdlist1">Returns</dt>
  8470. <dd>
  8471. <p><code>reinterpret_cast&lt;T*&gt;(p)</code></p>
  8472. </dd>
  8473. </dl>
  8474. </div>
  8475. </li>
  8476. </ul>
  8477. </div>
  8478. <div class="listingblock">
  8479. <div class="content">
  8480. <pre class="highlight"><code>template&lt;class T, class U&gt; std::shared_ptr&lt;T&gt;
  8481. reinterpret_pointer_cast(const std::shared_ptr&lt;U&gt;&amp; p) noexcept;</code></pre>
  8482. </div>
  8483. </div>
  8484. <div class="ulist none">
  8485. <ul class="none">
  8486. <li>
  8487. <p></p>
  8488. <div class="dlist">
  8489. <dl>
  8490. <dt class="hdlist1">Returns</dt>
  8491. <dd>
  8492. <p><code>std::reinterpret_pointer_cast&lt;T&gt;(p)</code></p>
  8493. </dd>
  8494. </dl>
  8495. </div>
  8496. </li>
  8497. </ul>
  8498. </div>
  8499. <div class="listingblock">
  8500. <div class="content">
  8501. <pre class="highlight"><code>template&lt;class T, class U&gt; std::unique_ptr&lt;T&gt;
  8502. reinterpret_pointer_cast(std::unique_ptr&lt;U&gt;&amp;&amp; p) noexcept;</code></pre>
  8503. </div>
  8504. </div>
  8505. <div class="ulist none">
  8506. <ul class="none">
  8507. <li>
  8508. <p></p>
  8509. <div class="dlist">
  8510. <dl>
  8511. <dt class="hdlist1">Requires</dt>
  8512. <dd>
  8513. <p>The expression <code>reinterpret_cast&lt;T*&gt;((U*)0)</code> must be well-formed.</p>
  8514. </dd>
  8515. <dt class="hdlist1">Returns</dt>
  8516. <dd>
  8517. <p><code>std::unique_ptr&lt;T&gt;(reinterpret_cast&lt;typename
  8518. std::unique_ptr&lt;T&gt;::element_type*&gt;(p.release()))</code>.</p>
  8519. </dd>
  8520. </dl>
  8521. </div>
  8522. </li>
  8523. </ul>
  8524. </div>
  8525. </div>
  8526. </div>
  8527. <div class="sect2">
  8528. <h3 id="pointer_cast_example">Example</h3>
  8529. <div class="paragraph">
  8530. <p>The following example demonstrates how the generic pointer casts help us
  8531. create pointer independent code.</p>
  8532. </div>
  8533. <div class="listingblock">
  8534. <div class="content">
  8535. <pre class="highlight"><code>#include &lt;boost/pointer_cast.hpp&gt;
  8536. #include &lt;boost/shared_ptr.hpp&gt;
  8537. class base {
  8538. public:
  8539. virtual ~base() { }
  8540. };
  8541. class derived : public base { };
  8542. template&lt;class Ptr&gt;
  8543. void check_if_it_is_derived(const Ptr&amp; ptr)
  8544. {
  8545. assert(boost::dynamic_pointer_cast&lt;derived&gt;(ptr) != 0);
  8546. }
  8547. int main()
  8548. {
  8549. base* ptr = new derived;
  8550. boost::shared_ptr&lt;base&gt; sptr(new derived);
  8551. check_if_it_is_derived(ptr);
  8552. check_if_it_is_derived(sptr);
  8553. delete ptr;
  8554. }</code></pre>
  8555. </div>
  8556. </div>
  8557. </div>
  8558. </div>
  8559. </div>
  8560. <div class="sect1">
  8561. <h2 id="pointer_to_other">pointer_to_other</h2>
  8562. <div class="sectionbody">
  8563. <div class="sect2">
  8564. <h3 id="pointer_to_other_description">Description</h3>
  8565. <div class="paragraph">
  8566. <p>The <code>pointer_to_other</code> utility provides a way, given a source pointer type, to obtain a pointer of the same type
  8567. to another pointee type.</p>
  8568. </div>
  8569. <div class="paragraph">
  8570. <p>There is test/example code in <a href="../../test/pointer_to_other_test.cpp">pointer_to_other_test.cpp</a>.</p>
  8571. </div>
  8572. </div>
  8573. <div class="sect2">
  8574. <h3 id="pointer_to_other_rationale">Rationale</h3>
  8575. <div class="paragraph">
  8576. <p>When building pointer independent classes, like memory managers, allocators, or containers, there is often a need to
  8577. define pointers generically, so that if a template parameter represents a pointer (for example, a raw or smart pointer
  8578. to an <code>int</code>), we can define another pointer of the same type to another pointee (a raw or smart pointer to a <code>float</code>.)</p>
  8579. </div>
  8580. <div class="listingblock">
  8581. <div class="content">
  8582. <pre class="highlight"><code>template &lt;class IntPtr&gt; class FloatPointerHolder
  8583. {
  8584. // Let's define a pointer to a float
  8585. typedef typename boost::pointer_to_other
  8586. &lt;IntPtr, float&gt;::type float_ptr_t;
  8587. float_ptr_t float_ptr;
  8588. };</code></pre>
  8589. </div>
  8590. </div>
  8591. </div>
  8592. <div class="sect2">
  8593. <h3 id="pointer_to_other_synopsis">Synopsis</h3>
  8594. <div class="paragraph">
  8595. <p><code>pointer_to_other</code> is defined in <code>&lt;boost/smart_ptr/pointer_to_other.hpp&gt;</code>.</p>
  8596. </div>
  8597. <div class="listingblock">
  8598. <div class="content">
  8599. <pre class="highlight"><code>namespace boost {
  8600. template&lt;class T, class U&gt; struct pointer_to_other;
  8601. template&lt;class T, class U,
  8602. template &lt;class&gt; class Sp&gt;
  8603. struct pointer_to_other&lt; Sp&lt;T&gt;, U &gt;
  8604. {
  8605. typedef Sp&lt;U&gt; type;
  8606. };
  8607. template&lt;class T, class T2, class U,
  8608. template &lt;class, class&gt; class Sp&gt;
  8609. struct pointer_to_other&lt; Sp&lt;T, T2&gt;, U &gt;
  8610. {
  8611. typedef Sp&lt;U, T2&gt; type;
  8612. };
  8613. template&lt;class T, class T2, class T3, class U,
  8614. template &lt;class, class, class&gt; class Sp&gt;
  8615. struct pointer_to_other&lt; Sp&lt;T, T2, T3&gt;, U &gt;
  8616. {
  8617. typedef Sp&lt;U, T2, T3&gt; type;
  8618. };
  8619. template&lt;class T, class U&gt;
  8620. struct pointer_to_other&lt; T*, U &gt;
  8621. {
  8622. typedef U* type;
  8623. };
  8624. }</code></pre>
  8625. </div>
  8626. </div>
  8627. <div class="paragraph">
  8628. <p>If these definitions are not correct for a specific smart pointer, we can define a specialization of <code>pointer_to_other</code>.</p>
  8629. </div>
  8630. </div>
  8631. <div class="sect2">
  8632. <h3 id="pointer_to_other_example">Example</h3>
  8633. <div class="listingblock">
  8634. <div class="content">
  8635. <pre class="highlight"><code>// Let's define a memory allocator that can
  8636. // work with raw and smart pointers
  8637. #include &lt;boost/pointer_to_other.hpp&gt;
  8638. template &lt;class VoidPtr&gt;
  8639. class memory_allocator
  8640. {
  8641. // Predefine a memory_block
  8642. struct block;
  8643. // Define a pointer to a memory_block from a void pointer
  8644. // If VoidPtr is void *, block_ptr_t is block*
  8645. // If VoidPtr is smart_ptr&lt;void&gt;, block_ptr_t is smart_ptr&lt;block&gt;
  8646. typedef typename boost::pointer_to_other
  8647. &lt;VoidPtr, block&gt;::type block_ptr_t;
  8648. struct block
  8649. {
  8650. std::size_t size;
  8651. block_ptr_t next_block;
  8652. };
  8653. block_ptr_t free_blocks;
  8654. };</code></pre>
  8655. </div>
  8656. </div>
  8657. <div class="paragraph">
  8658. <p>As we can see, using <code>pointer_to_other</code> we can create pointer independent code.</p>
  8659. </div>
  8660. </div>
  8661. </div>
  8662. </div>
  8663. <div class="sect1">
  8664. <h2 id="atomic_shared_ptr">atomic_shared_ptr</h2>
  8665. <div class="sectionbody">
  8666. <div class="sect2">
  8667. <h3 id="atomic_shared_ptr_description">Description</h3>
  8668. <div class="paragraph">
  8669. <p>The class template <code>atomic_shared_ptr&lt;T&gt;</code> implements the interface of <code>std::atomic</code>
  8670. for a contained value of type <code>shared_ptr&lt;T&gt;</code>. Concurrent access to <code>atomic_shared_ptr</code>
  8671. is not a data race.</p>
  8672. </div>
  8673. </div>
  8674. <div class="sect2">
  8675. <h3 id="atomic_shared_ptr_synopsis">Synopsis</h3>
  8676. <div class="paragraph">
  8677. <p><code>atomic_shared_ptr</code> is defined in <code>&lt;boost/smart_ptr/atomic_shared_ptr.hpp&gt;</code>.</p>
  8678. </div>
  8679. <div class="listingblock">
  8680. <div class="content">
  8681. <pre class="highlight"><code>namespace boost {
  8682. template&lt;class T&gt; class atomic_shared_ptr {
  8683. private:
  8684. shared_ptr&lt;T&gt; p_; // exposition only
  8685. atomic_shared_ptr(const atomic_shared_ptr&amp;) = delete;
  8686. atomic_shared_ptr&amp; operator=(const atomic_shared_ptr&amp;) = delete;
  8687. public:
  8688. constexpr atomic_shared_ptr() noexcept;
  8689. atomic_shared_ptr( shared_ptr&lt;T&gt; p ) noexcept;
  8690. atomic_shared_ptr&amp; operator=( shared_ptr&lt;T&gt; r ) noexcept;
  8691. bool is_lock_free() const noexcept;
  8692. shared_ptr&lt;T&gt; load( int = 0 ) const noexcept;
  8693. operator shared_ptr&lt;T&gt;() const noexcept;
  8694. void store( shared_ptr&lt;T&gt; r, int = 0 ) noexcept;
  8695. shared_ptr&lt;T&gt; exchange( shared_ptr&lt;T&gt; r, int = 0 ) noexcept;
  8696. bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int, int ) noexcept;
  8697. bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int = 0 ) noexcept;
  8698. bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int, int ) noexcept;
  8699. bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int = 0 ) noexcept;
  8700. bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int, int ) noexcept;
  8701. bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int = 0 ) noexcept;
  8702. bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int, int ) noexcept;
  8703. bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int = 0 ) noexcept;
  8704. };
  8705. }</code></pre>
  8706. </div>
  8707. </div>
  8708. </div>
  8709. <div class="sect2">
  8710. <h3 id="atomic_shared_ptr_members">Members</h3>
  8711. <div class="listingblock">
  8712. <div class="content">
  8713. <pre class="highlight"><code>constexpr atomic_shared_ptr() noexcept;</code></pre>
  8714. </div>
  8715. </div>
  8716. <div class="ulist none">
  8717. <ul class="none">
  8718. <li>
  8719. <p></p>
  8720. <div class="dlist">
  8721. <dl>
  8722. <dt class="hdlist1">Effects</dt>
  8723. <dd>
  8724. <p>Default-initializes <code>p_</code>.</p>
  8725. </dd>
  8726. </dl>
  8727. </div>
  8728. </li>
  8729. </ul>
  8730. </div>
  8731. <div class="listingblock">
  8732. <div class="content">
  8733. <pre class="highlight"><code>atomic_shared_ptr( shared_ptr&lt;T&gt; p ) noexcept;</code></pre>
  8734. </div>
  8735. </div>
  8736. <div class="ulist none">
  8737. <ul class="none">
  8738. <li>
  8739. <p></p>
  8740. <div class="dlist">
  8741. <dl>
  8742. <dt class="hdlist1">Effects</dt>
  8743. <dd>
  8744. <p>Initializes <code>p_</code> to <code>p</code>.</p>
  8745. </dd>
  8746. </dl>
  8747. </div>
  8748. </li>
  8749. </ul>
  8750. </div>
  8751. <div class="listingblock">
  8752. <div class="content">
  8753. <pre class="highlight"><code>atomic_shared_ptr&amp; operator=( shared_ptr&lt;T&gt; r ) noexcept;</code></pre>
  8754. </div>
  8755. </div>
  8756. <div class="ulist none">
  8757. <ul class="none">
  8758. <li>
  8759. <p></p>
  8760. <div class="dlist">
  8761. <dl>
  8762. <dt class="hdlist1">Effects</dt>
  8763. <dd>
  8764. <p><code>p_.swap(r)</code>.</p>
  8765. </dd>
  8766. <dt class="hdlist1">Returns</dt>
  8767. <dd>
  8768. <p><code>*this</code>.</p>
  8769. </dd>
  8770. </dl>
  8771. </div>
  8772. </li>
  8773. </ul>
  8774. </div>
  8775. <div class="listingblock">
  8776. <div class="content">
  8777. <pre class="highlight"><code>bool is_lock_free() const noexcept;</code></pre>
  8778. </div>
  8779. </div>
  8780. <div class="ulist none">
  8781. <ul class="none">
  8782. <li>
  8783. <p></p>
  8784. <div class="dlist">
  8785. <dl>
  8786. <dt class="hdlist1">Returns</dt>
  8787. <dd>
  8788. <p><code>false</code>.</p>
  8789. </dd>
  8790. </dl>
  8791. </div>
  8792. </li>
  8793. </ul>
  8794. </div>
  8795. <div class="admonitionblock note">
  8796. <table>
  8797. <tr>
  8798. <td class="icon">
  8799. <div class="title">Note</div>
  8800. </td>
  8801. <td class="content">
  8802. This implementation is not lock-free.
  8803. </td>
  8804. </tr>
  8805. </table>
  8806. </div>
  8807. <div class="listingblock">
  8808. <div class="content">
  8809. <pre class="highlight"><code>shared_ptr&lt;T&gt; load( int = 0 ) const noexcept;</code></pre>
  8810. </div>
  8811. </div>
  8812. <div class="listingblock">
  8813. <div class="content">
  8814. <pre class="highlight"><code>operator shared_ptr&lt;T&gt;() const noexcept;</code></pre>
  8815. </div>
  8816. </div>
  8817. <div class="ulist none">
  8818. <ul class="none">
  8819. <li>
  8820. <p></p>
  8821. <div class="dlist">
  8822. <dl>
  8823. <dt class="hdlist1">Returns</dt>
  8824. <dd>
  8825. <p><code>p_</code>.</p>
  8826. </dd>
  8827. </dl>
  8828. </div>
  8829. </li>
  8830. </ul>
  8831. </div>
  8832. <div class="admonitionblock note">
  8833. <table>
  8834. <tr>
  8835. <td class="icon">
  8836. <div class="title">Note</div>
  8837. </td>
  8838. <td class="content">
  8839. The <code>int</code> argument is intended to be of type <code>memory_order</code>, but is ignored.
  8840. This implementation is lock-based and therefore always sequentially consistent.
  8841. </td>
  8842. </tr>
  8843. </table>
  8844. </div>
  8845. <div class="listingblock">
  8846. <div class="content">
  8847. <pre class="highlight"><code>void store( shared_ptr&lt;T&gt; r, int = 0 ) noexcept;</code></pre>
  8848. </div>
  8849. </div>
  8850. <div class="ulist none">
  8851. <ul class="none">
  8852. <li>
  8853. <p></p>
  8854. <div class="dlist">
  8855. <dl>
  8856. <dt class="hdlist1">Effects</dt>
  8857. <dd>
  8858. <p><code>p_.swap(r)</code>.</p>
  8859. </dd>
  8860. </dl>
  8861. </div>
  8862. </li>
  8863. </ul>
  8864. </div>
  8865. <div class="listingblock">
  8866. <div class="content">
  8867. <pre class="highlight"><code>shared_ptr&lt;T&gt; exchange( shared_ptr&lt;T&gt; r, int = 0 ) noexcept;</code></pre>
  8868. </div>
  8869. </div>
  8870. <div class="ulist none">
  8871. <ul class="none">
  8872. <li>
  8873. <p></p>
  8874. <div class="dlist">
  8875. <dl>
  8876. <dt class="hdlist1">Effects</dt>
  8877. <dd>
  8878. <p><code>p_.swap(r)</code>.</p>
  8879. </dd>
  8880. <dt class="hdlist1">Returns</dt>
  8881. <dd>
  8882. <p>The old value of <code>p_</code>.</p>
  8883. </dd>
  8884. </dl>
  8885. </div>
  8886. </li>
  8887. </ul>
  8888. </div>
  8889. <div class="listingblock">
  8890. <div class="content">
  8891. <pre class="highlight"><code>bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int, int ) noexcept;</code></pre>
  8892. </div>
  8893. </div>
  8894. <div class="listingblock">
  8895. <div class="content">
  8896. <pre class="highlight"><code>bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int = 0 ) noexcept;</code></pre>
  8897. </div>
  8898. </div>
  8899. <div class="listingblock">
  8900. <div class="content">
  8901. <pre class="highlight"><code>bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int, int ) noexcept;</code></pre>
  8902. </div>
  8903. </div>
  8904. <div class="listingblock">
  8905. <div class="content">
  8906. <pre class="highlight"><code>bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, const shared_ptr&lt;T&gt;&amp; w, int = 0 ) noexcept;</code></pre>
  8907. </div>
  8908. </div>
  8909. <div class="ulist none">
  8910. <ul class="none">
  8911. <li>
  8912. <p></p>
  8913. <div class="dlist">
  8914. <dl>
  8915. <dt class="hdlist1">Effects</dt>
  8916. <dd>
  8917. <p>If <code>p_</code> is equivalent to <code>v</code>, assigns <code>w</code> to <code>p_</code>, otherwise assigns <code>p_</code> to <code>v</code>.</p>
  8918. </dd>
  8919. <dt class="hdlist1">Returns</dt>
  8920. <dd>
  8921. <p><code>true</code> if <code>p_</code> was equivalent to <code>v</code>, <code>false</code> otherwise.</p>
  8922. </dd>
  8923. <dt class="hdlist1">Remarks</dt>
  8924. <dd>
  8925. <p>Two <code>shared_ptr</code> instances are equivalent if they store the same pointer value and <em>share ownership</em>.</p>
  8926. </dd>
  8927. </dl>
  8928. </div>
  8929. </li>
  8930. </ul>
  8931. </div>
  8932. <div class="listingblock">
  8933. <div class="content">
  8934. <pre class="highlight"><code>bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int, int ) noexcept;</code></pre>
  8935. </div>
  8936. </div>
  8937. <div class="listingblock">
  8938. <div class="content">
  8939. <pre class="highlight"><code>bool compare_exchange_weak( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int = 0 ) noexcept;</code></pre>
  8940. </div>
  8941. </div>
  8942. <div class="listingblock">
  8943. <div class="content">
  8944. <pre class="highlight"><code>bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int, int ) noexcept;</code></pre>
  8945. </div>
  8946. </div>
  8947. <div class="listingblock">
  8948. <div class="content">
  8949. <pre class="highlight"><code>bool compare_exchange_strong( shared_ptr&lt;T&gt;&amp; v, shared_ptr&lt;T&gt;&amp;&amp; w, int = 0 ) noexcept;</code></pre>
  8950. </div>
  8951. </div>
  8952. <div class="ulist none">
  8953. <ul class="none">
  8954. <li>
  8955. <p></p>
  8956. <div class="dlist">
  8957. <dl>
  8958. <dt class="hdlist1">Effects</dt>
  8959. <dd>
  8960. <p>If <code>p_</code> is equivalent to <code>v</code>, assigns <code>std::move(w)</code> to <code>p_</code>, otherwise assigns <code>p_</code> to <code>v</code>.</p>
  8961. </dd>
  8962. <dt class="hdlist1">Returns</dt>
  8963. <dd>
  8964. <p><code>true</code> if <code>p_</code> was equivalent to <code>v</code>, <code>false</code> otherwise.</p>
  8965. </dd>
  8966. <dt class="hdlist1">Remarks</dt>
  8967. <dd>
  8968. <p>The old value of <code>w</code> is not preserved in either case.</p>
  8969. </dd>
  8970. </dl>
  8971. </div>
  8972. </li>
  8973. </ul>
  8974. </div>
  8975. </div>
  8976. </div>
  8977. </div>
  8978. <div class="sect1">
  8979. <h2 id="techniques">Appendix A: Smart Pointer Programming Techniques</h2>
  8980. <div class="sectionbody">
  8981. <div class="sect2">
  8982. <h3 id="techniques_incomplete">Using incomplete classes for implementation hiding</h3>
  8983. <div class="paragraph">
  8984. <p>A proven technique (that works in C, too) for separating interface from implementation is to use a pointer to an incomplete class as an opaque handle:</p>
  8985. </div>
  8986. <div class="listingblock">
  8987. <div class="content">
  8988. <pre class="highlight"><code>class FILE;
  8989. FILE * fopen(char const * name, char const * mode);
  8990. void fread(FILE * f, void * data, size_t size);
  8991. void fclose(FILE * f);</code></pre>
  8992. </div>
  8993. </div>
  8994. <div class="paragraph">
  8995. <p>It is possible to express the above interface using <code>shared_ptr</code>, eliminating the need to manually call <code>fclose</code>:</p>
  8996. </div>
  8997. <div class="listingblock">
  8998. <div class="content">
  8999. <pre class="highlight"><code>class FILE;
  9000. shared_ptr&lt;FILE&gt; fopen(char const * name, char const * mode);
  9001. void fread(shared_ptr&lt;FILE&gt; f, void * data, size_t size);</code></pre>
  9002. </div>
  9003. </div>
  9004. <div class="paragraph">
  9005. <p>This technique relies on <code>shared_ptr</code>&#8217;s ability to execute a custom deleter, eliminating the explicit call to <code>fclose</code>, and on the fact that <code>shared_ptr&lt;X&gt;</code> can be copied and destroyed when <code>X</code> is incomplete.</p>
  9006. </div>
  9007. </div>
  9008. <div class="sect2">
  9009. <h3 id="techniques_the_pimpl_idiom">The "Pimpl" idiom</h3>
  9010. <div class="paragraph">
  9011. <p>A C&#43;&#43; specific variation of the incomplete class pattern is the "Pimpl" idiom. The incomplete class is not exposed to the user; it is hidden behind a forwarding facade. <code>shared_ptr</code> can be used to implement a "Pimpl":</p>
  9012. </div>
  9013. <div class="listingblock">
  9014. <div class="content">
  9015. <pre class="highlight"><code>// file.hpp:
  9016. class file
  9017. {
  9018. private:
  9019. class impl;
  9020. shared_ptr&lt;impl&gt; pimpl_;
  9021. public:
  9022. file(char const * name, char const * mode);
  9023. // compiler generated members are fine and useful
  9024. void read(void * data, size_t size);
  9025. };
  9026. // file.cpp:
  9027. #include "file.hpp"
  9028. class file::impl
  9029. {
  9030. private:
  9031. impl(impl const &amp;);
  9032. impl &amp; operator=(impl const &amp;);
  9033. // private data
  9034. public:
  9035. impl(char const * name, char const * mode) { ... }
  9036. ~impl() { ... }
  9037. void read(void * data, size_t size) { ... }
  9038. };
  9039. file::file(char const * name, char const * mode): pimpl_(new impl(name, mode))
  9040. {
  9041. }
  9042. void file::read(void * data, size_t size)
  9043. {
  9044. pimpl_-&gt;read(data, size);
  9045. }</code></pre>
  9046. </div>
  9047. </div>
  9048. <div class="paragraph">
  9049. <p>The key thing to note here is that the compiler-generated copy constructor, assignment operator, and destructor all have a sensible meaning. As a result, <code>file</code> is <code>CopyConstructible</code> and <code>Assignable</code>, allowing its use in standard containers.</p>
  9050. </div>
  9051. </div>
  9052. <div class="sect2">
  9053. <h3 id="techniques_using_abstract_classes_for_implementation_hiding">Using abstract classes for implementation hiding</h3>
  9054. <div class="paragraph">
  9055. <p>Another widely used C++ idiom for separating inteface and implementation is to use abstract base classes and factory functions.
  9056. The abstract classes are sometimes called "interfaces" and the pattern is known as "interface-based programming". Again,
  9057. <code>shared_ptr</code> can be used as the return type of the factory functions:</p>
  9058. </div>
  9059. <div class="listingblock">
  9060. <div class="content">
  9061. <pre class="highlight"><code>// X.hpp:
  9062. class X
  9063. {
  9064. public:
  9065. virtual void f() = 0;
  9066. virtual void g() = 0;
  9067. protected:
  9068. ~X() {}
  9069. };
  9070. shared_ptr&lt;X&gt; createX();
  9071. // X.cpp:
  9072. class X_impl: public X
  9073. {
  9074. private:
  9075. X_impl(X_impl const &amp;);
  9076. X_impl &amp; operator=(X_impl const &amp;);
  9077. public:
  9078. virtual void f()
  9079. {
  9080. // ...
  9081. }
  9082. virtual void g()
  9083. {
  9084. // ...
  9085. }
  9086. };
  9087. shared_ptr&lt;X&gt; createX()
  9088. {
  9089. shared_ptr&lt;X&gt; px(new X_impl);
  9090. return px;
  9091. }</code></pre>
  9092. </div>
  9093. </div>
  9094. <div class="paragraph">
  9095. <p>A key property of <code>shared_ptr</code> is that the allocation, construction, deallocation, and destruction details are captured at the point of construction, inside the factory function.</p>
  9096. </div>
  9097. <div class="paragraph">
  9098. <p>Note the protected and nonvirtual destructor in the example above. The client code cannot, and does not need to, delete a pointer to <code>X</code>; the <code>shared_ptr&lt;X&gt;</code> instance returned from <code>createX</code> will correctly call <code>~X_impl</code>.</p>
  9099. </div>
  9100. </div>
  9101. <div class="sect2">
  9102. <h3 id="techniques_preventing_delete_px_get">Preventing <code>delete px.get()</code></h3>
  9103. <div class="paragraph">
  9104. <p>It is often desirable to prevent client code from deleting a pointer that is being managed by <code>shared_ptr</code>. The previous technique showed one possible approach, using a protected destructor. Another alternative is to use a private deleter:</p>
  9105. </div>
  9106. <div class="listingblock">
  9107. <div class="content">
  9108. <pre class="highlight"><code>class X
  9109. {
  9110. private:
  9111. ~X();
  9112. class deleter;
  9113. friend class deleter;
  9114. class deleter
  9115. {
  9116. public:
  9117. void operator()(X * p) { delete p; }
  9118. };
  9119. public:
  9120. static shared_ptr&lt;X&gt; create()
  9121. {
  9122. shared_ptr&lt;X&gt; px(new X, X::deleter());
  9123. return px;
  9124. }
  9125. };</code></pre>
  9126. </div>
  9127. </div>
  9128. </div>
  9129. <div class="sect2">
  9130. <h3 id="techniques_encapsulating_allocation_details_wrapping_factory_functions">Encapsulating allocation details, wrapping factory functions</h3>
  9131. <div class="paragraph">
  9132. <p><code>shared_ptr</code> can be used in creating C&#43;&#43; wrappers over existing C style library interfaces that return raw pointers from their factory functions
  9133. to encapsulate allocation details. As an example, consider this interface, where <code>CreateX</code> might allocate <code>X</code> from its own private heap, <code>~X</code> may
  9134. be inaccessible, or <code>X</code> may be incomplete:</p>
  9135. </div>
  9136. <div class="literalblock">
  9137. <div class="content">
  9138. <pre>X * CreateX();
  9139. void DestroyX(X *);</pre>
  9140. </div>
  9141. </div>
  9142. <div class="paragraph">
  9143. <p>The only way to reliably destroy a pointer returned by <code>CreateX</code> is to call <code>DestroyX</code>.</p>
  9144. </div>
  9145. <div class="paragraph">
  9146. <p>Here is how a <code>shared_ptr</code>-based wrapper may look like:</p>
  9147. </div>
  9148. <div class="literalblock">
  9149. <div class="content">
  9150. <pre>shared_ptr&lt;X&gt; createX()
  9151. {
  9152. shared_ptr&lt;X&gt; px(CreateX(), DestroyX);
  9153. return px;
  9154. }</pre>
  9155. </div>
  9156. </div>
  9157. <div class="paragraph">
  9158. <p>Client code that calls <code>createX</code> still does not need to know how the object has been allocated, but now the destruction is automatic.</p>
  9159. </div>
  9160. </div>
  9161. <div class="sect2">
  9162. <h3 id="techniques_static">Using a shared_ptr to hold a pointer to a statically allocated object</h3>
  9163. <div class="paragraph">
  9164. <p>Sometimes it is desirable to create a <code>shared_ptr</code> to an already existing object, so that the <code>shared_ptr</code> does not attempt to destroy the
  9165. object when there are no more references left. As an example, the factory function:</p>
  9166. </div>
  9167. <div class="literalblock">
  9168. <div class="content">
  9169. <pre>shared_ptr&lt;X&gt; createX();</pre>
  9170. </div>
  9171. </div>
  9172. <div class="paragraph">
  9173. <p>in certain situations may need to return a pointer to a statically allocated <code>X</code> instance.</p>
  9174. </div>
  9175. <div class="paragraph">
  9176. <p>The solution is to use a custom deleter that does nothing:</p>
  9177. </div>
  9178. <div class="listingblock">
  9179. <div class="content">
  9180. <pre class="highlight"><code>struct null_deleter
  9181. {
  9182. void operator()(void const *) const
  9183. {
  9184. }
  9185. };
  9186. static X x;
  9187. shared_ptr&lt;X&gt; createX()
  9188. {
  9189. shared_ptr&lt;X&gt; px(&amp;x, null_deleter());
  9190. return px;
  9191. }</code></pre>
  9192. </div>
  9193. </div>
  9194. <div class="paragraph">
  9195. <p>The same technique works for any object known to outlive the pointer.</p>
  9196. </div>
  9197. </div>
  9198. <div class="sect2">
  9199. <h3 id="techniques_using_a_shared_ptr_to_hold_a_pointer_to_a_com_object">Using a shared_ptr to hold a pointer to a COM Object</h3>
  9200. <div class="paragraph">
  9201. <p>Background: COM objects have an embedded reference count and two member functions that manipulate it. <code>AddRef()</code> increments the count.
  9202. <code>Release()</code> decrements the count and destroys itself when the count drops to zero.</p>
  9203. </div>
  9204. <div class="paragraph">
  9205. <p>It is possible to hold a pointer to a COM object in a <code>shared_ptr</code>:</p>
  9206. </div>
  9207. <div class="literalblock">
  9208. <div class="content">
  9209. <pre>shared_ptr&lt;IWhatever&gt; make_shared_from_COM(IWhatever * p)
  9210. {
  9211. p-&gt;AddRef();
  9212. shared_ptr&lt;IWhatever&gt; pw(p, mem_fn(&amp;IWhatever::Release));
  9213. return pw;
  9214. }</pre>
  9215. </div>
  9216. </div>
  9217. <div class="paragraph">
  9218. <p>Note, however, that <code>shared_ptr</code> copies created from <code>pw</code> will not "register" in the embedded count of the COM object;
  9219. they will share the single reference created in <code>make_shared_from_COM</code>. Weak pointers created from <code>pw</code> will be invalidated when the last
  9220. <code>shared_ptr</code> is destroyed, regardless of whether the COM object itself is still alive.</p>
  9221. </div>
  9222. <div class="paragraph">
  9223. <p>As <a href="../../../../libs/bind/mem_fn.html#Q3">explained</a> in the <code>mem_fn</code> documentation, you need to <code>#define BOOST_MEM_FN_ENABLE_STDCALL</code> first.</p>
  9224. </div>
  9225. </div>
  9226. <div class="sect2">
  9227. <h3 id="techniques_intrusive">Using a shared_ptr to hold a pointer to an object with an embedded reference count</h3>
  9228. <div class="paragraph">
  9229. <p>This is a generalization of the above technique. The example assumes that the object implements the two functions required by <code><a href="#intrusive_ptr">intrusive_ptr</a></code>,
  9230. <code>intrusive_ptr_add_ref</code> and <code>intrusive_ptr_release</code>:</p>
  9231. </div>
  9232. <div class="listingblock">
  9233. <div class="content">
  9234. <pre class="highlight"><code>template&lt;class T&gt; struct intrusive_deleter
  9235. {
  9236. void operator()(T * p)
  9237. {
  9238. if(p) intrusive_ptr_release(p);
  9239. }
  9240. };
  9241. shared_ptr&lt;X&gt; make_shared_from_intrusive(X * p)
  9242. {
  9243. if(p) intrusive_ptr_add_ref(p);
  9244. shared_ptr&lt;X&gt; px(p, intrusive_deleter&lt;X&gt;());
  9245. return px;
  9246. }</code></pre>
  9247. </div>
  9248. </div>
  9249. </div>
  9250. <div class="sect2">
  9251. <h3 id="techniques_using_a_shared_ptr_to_hold_another_shared_ownership_smart_pointer">Using a shared_ptr to hold another shared ownership smart pointer</h3>
  9252. <div class="paragraph">
  9253. <p>One of the design goals of <code>shared_ptr</code> is to be used in library interfaces. It is possible to encounter a situation where a library takes a
  9254. <code>shared_ptr</code> argument, but the object at hand is being managed by a different reference counted or linked smart pointer.</p>
  9255. </div>
  9256. <div class="paragraph">
  9257. <p>It is possible to exploit <code>shared_ptr</code>&#8217;s custom deleter feature to wrap this existing smart pointer behind a <code>shared_ptr</code> facade:</p>
  9258. </div>
  9259. <div class="listingblock">
  9260. <div class="content">
  9261. <pre class="highlight"><code>template&lt;class P&gt; struct smart_pointer_deleter
  9262. {
  9263. private:
  9264. P p_;
  9265. public:
  9266. smart_pointer_deleter(P const &amp; p): p_(p)
  9267. {
  9268. }
  9269. void operator()(void const *)
  9270. {
  9271. p_.reset();
  9272. }
  9273. P const &amp; get() const
  9274. {
  9275. return p_;
  9276. }
  9277. };
  9278. shared_ptr&lt;X&gt; make_shared_from_another(another_ptr&lt;X&gt; qx)
  9279. {
  9280. shared_ptr&lt;X&gt; px(qx.get(), smart_pointer_deleter&lt; another_ptr&lt;X&gt; &gt;(qx));
  9281. return px;
  9282. }</code></pre>
  9283. </div>
  9284. </div>
  9285. <div class="paragraph">
  9286. <p>One subtle point is that deleters are not allowed to throw exceptions, and the above example as written assumes that <code>p_.reset()</code> doesn&#8217;t throw.
  9287. If this is not the case, <code>p_.reset();</code> should be wrapped in a <code>try {} catch(&#8230;&#8203;) {}</code> block that ignores exceptions. In the (usually unlikely) event
  9288. when an exception is thrown and ignored, <code>p_</code> will be released when the lifetime of the deleter ends. This happens when all references, including
  9289. weak pointers, are destroyed or reset.</p>
  9290. </div>
  9291. <div class="paragraph">
  9292. <p>Another twist is that it is possible, given the above <code>shared_ptr</code> instance, to recover the original smart pointer, using <code><a href="#shared_ptr_get_deleter">get_deleter</a></code>:</p>
  9293. </div>
  9294. <div class="listingblock">
  9295. <div class="content">
  9296. <pre class="highlight"><code>void extract_another_from_shared(shared_ptr&lt;X&gt; px)
  9297. {
  9298. typedef smart_pointer_deleter&lt; another_ptr&lt;X&gt; &gt; deleter;
  9299. if(deleter const * pd = get_deleter&lt;deleter&gt;(px))
  9300. {
  9301. another_ptr&lt;X&gt; qx = pd-&gt;get();
  9302. }
  9303. else
  9304. {
  9305. // not one of ours
  9306. }
  9307. }</code></pre>
  9308. </div>
  9309. </div>
  9310. </div>
  9311. <div class="sect2">
  9312. <h3 id="techniques_from_raw">Obtaining a shared_ptr from a raw pointer</h3>
  9313. <div class="paragraph">
  9314. <p>Sometimes it is necessary to obtain a <code>shared_ptr</code> given a raw pointer to an object that is already managed by another <code>shared_ptr</code> instance. Example:</p>
  9315. </div>
  9316. <div class="literalblock">
  9317. <div class="content">
  9318. <pre>void f(X * p)
  9319. {
  9320. shared_ptr&lt;X&gt; px(???);
  9321. }</pre>
  9322. </div>
  9323. </div>
  9324. <div class="paragraph">
  9325. <p>Inside <code>f</code>, we&#8217;d like to create a <code>shared_ptr</code> to <code>*p</code>.</p>
  9326. </div>
  9327. <div class="paragraph">
  9328. <p>In the general case, this problem has no solution. One approach is to modify <code>f</code> to take a <code>shared_ptr</code>, if possible:</p>
  9329. </div>
  9330. <div class="literalblock">
  9331. <div class="content">
  9332. <pre>void f(shared_ptr&lt;X&gt; px);</pre>
  9333. </div>
  9334. </div>
  9335. <div class="paragraph">
  9336. <p>The same transformation can be used for nonvirtual member functions, to convert the implicit <code>this</code>:</p>
  9337. </div>
  9338. <div class="literalblock">
  9339. <div class="content">
  9340. <pre>void X::f(int m);</pre>
  9341. </div>
  9342. </div>
  9343. <div class="paragraph">
  9344. <p>would become a free function with a <code>shared_ptr</code> first argument:</p>
  9345. </div>
  9346. <div class="literalblock">
  9347. <div class="content">
  9348. <pre>void f(shared_ptr&lt;X&gt; this_, int m);</pre>
  9349. </div>
  9350. </div>
  9351. <div class="paragraph">
  9352. <p>If <code>f</code> cannot be changed, but <code>X</code> uses intrusive counting, use <code><a href="#techniques_intrusive">make_shared_from_intrusive</a></code> described above. Or, if it&#8217;s known that the <code>shared_ptr</code> created in <code>f</code> will never outlive the object, use <a href="#techniques_static">a null deleter</a>.</p>
  9353. </div>
  9354. </div>
  9355. <div class="sect2">
  9356. <h3 id="techniques_obtaining_a_shared_ptr_weak_ptr_to_this_in_a_constructor">Obtaining a shared_ptr (weak_ptr) to this in a constructor</h3>
  9357. <div class="paragraph">
  9358. <p>Some designs require objects to register themselves on construction with a central authority. When the registration routines take a <code>shared_ptr</code>, this leads to the question how could a constructor obtain a <code>shared_ptr</code> to <code>this</code>:</p>
  9359. </div>
  9360. <div class="listingblock">
  9361. <div class="content">
  9362. <pre class="highlight"><code>class X
  9363. {
  9364. public:
  9365. X()
  9366. {
  9367. shared_ptr&lt;X&gt; this_(???);
  9368. }
  9369. };</code></pre>
  9370. </div>
  9371. </div>
  9372. <div class="paragraph">
  9373. <p>In the general case, the problem cannot be solved. The <code>X</code> instance being constructed can be an automatic variable or a static variable; it can be created on the heap:</p>
  9374. </div>
  9375. <div class="literalblock">
  9376. <div class="content">
  9377. <pre>shared_ptr&lt;X&gt; px(new X);</pre>
  9378. </div>
  9379. </div>
  9380. <div class="paragraph">
  9381. <p>but at construction time, <code>px</code> does not exist yet, and it is impossible to create another <code>shared_ptr</code> instance that shares ownership with it.</p>
  9382. </div>
  9383. <div class="paragraph">
  9384. <p>Depending on context, if the inner <code>shared_ptr this_</code> doesn&#8217;t need to keep the object alive, use a <code>null_deleter</code> as explained <a href="#techniques_static">here</a> and <a href="#techniques_weak_without_shared">here</a>.
  9385. If <code>X</code> is supposed to always live on the heap, and be managed by a <code>shared_ptr</code>, use a static factory function:</p>
  9386. </div>
  9387. <div class="listingblock">
  9388. <div class="content">
  9389. <pre class="highlight"><code>class X
  9390. {
  9391. private:
  9392. X() { ... }
  9393. public:
  9394. static shared_ptr&lt;X&gt; create()
  9395. {
  9396. shared_ptr&lt;X&gt; px(new X);
  9397. // use px as 'this_'
  9398. return px;
  9399. }
  9400. };</code></pre>
  9401. </div>
  9402. </div>
  9403. </div>
  9404. <div class="sect2">
  9405. <h3 id="techniques_obtaining_a_shared_ptr_to_this">Obtaining a shared_ptr to this</h3>
  9406. <div class="paragraph">
  9407. <p>Sometimes it is needed to obtain a <code>shared_ptr</code> from <code>this</code> in a virtual member function under the assumption that <code>this</code> is already managed by a <code>shared_ptr</code>.
  9408. The transformations <a href="#techniques_from_raw">described in the previous technique</a> cannot be applied.</p>
  9409. </div>
  9410. <div class="paragraph">
  9411. <p>A typical example:</p>
  9412. </div>
  9413. <div class="listingblock">
  9414. <div class="content">
  9415. <pre class="highlight"><code>class X
  9416. {
  9417. public:
  9418. virtual void f() = 0;
  9419. protected:
  9420. ~X() {}
  9421. };
  9422. class Y
  9423. {
  9424. public:
  9425. virtual shared_ptr&lt;X&gt; getX() = 0;
  9426. protected:
  9427. ~Y() {}
  9428. };
  9429. // --
  9430. class impl: public X, public Y
  9431. {
  9432. public:
  9433. impl() { ... }
  9434. virtual void f() { ... }
  9435. virtual shared_ptr&lt;X&gt; getX()
  9436. {
  9437. shared_ptr&lt;X&gt; px(???);
  9438. return px;
  9439. }
  9440. };</code></pre>
  9441. </div>
  9442. </div>
  9443. <div class="paragraph">
  9444. <p>The solution is to keep a weak pointer to <code>this</code> as a member in <code>impl</code>:</p>
  9445. </div>
  9446. <div class="listingblock">
  9447. <div class="content">
  9448. <pre class="highlight"><code>class impl: public X, public Y
  9449. {
  9450. private:
  9451. weak_ptr&lt;impl&gt; weak_this;
  9452. impl(impl const &amp;);
  9453. impl &amp; operator=(impl const &amp;);
  9454. impl() { ... }
  9455. public:
  9456. static shared_ptr&lt;impl&gt; create()
  9457. {
  9458. shared_ptr&lt;impl&gt; pi(new impl);
  9459. pi-&gt;weak_this = pi;
  9460. return pi;
  9461. }
  9462. virtual void f() { ... }
  9463. virtual shared_ptr&lt;X&gt; getX()
  9464. {
  9465. shared_ptr&lt;X&gt; px(weak_this);
  9466. return px;
  9467. }
  9468. };</code></pre>
  9469. </div>
  9470. </div>
  9471. <div class="paragraph">
  9472. <p>The library now includes a helper class template <code><a href="#enable_shared_from_this">enable_shared_from_this</a></code> that can be used to encapsulate the solution:</p>
  9473. </div>
  9474. <div class="listingblock">
  9475. <div class="content">
  9476. <pre class="highlight"><code>class impl: public X, public Y, public enable_shared_from_this&lt;impl&gt;
  9477. {
  9478. public:
  9479. impl(impl const &amp;);
  9480. impl &amp; operator=(impl const &amp;);
  9481. public:
  9482. virtual void f() { ... }
  9483. virtual shared_ptr&lt;X&gt; getX()
  9484. {
  9485. return shared_from_this();
  9486. }
  9487. }</code></pre>
  9488. </div>
  9489. </div>
  9490. <div class="paragraph">
  9491. <p>Note that you no longer need to manually initialize the <code>weak_ptr</code> member in <code>enable_shared_from_this</code>. Constructing a <code>shared_ptr</code> to <code>impl</code> takes care of that.</p>
  9492. </div>
  9493. </div>
  9494. <div class="sect2">
  9495. <h3 id="techniques_using_shared_ptr_as_a_smart_counted_handle">Using shared_ptr as a smart counted handle</h3>
  9496. <div class="paragraph">
  9497. <p>Some library interfaces use opaque handles, a variation of the <a href="#techniques_incomplete">incomplete class technique</a> described above. An example:</p>
  9498. </div>
  9499. <div class="listingblock">
  9500. <div class="content">
  9501. <pre class="highlight"><code>typedef void * HANDLE;
  9502. HANDLE CreateProcess();
  9503. void CloseHandle(HANDLE);</code></pre>
  9504. </div>
  9505. </div>
  9506. <div class="paragraph">
  9507. <p>Instead of a raw pointer, it is possible to use <code>shared_ptr</code> as the handle and get reference counting and automatic resource management for free:</p>
  9508. </div>
  9509. <div class="listingblock">
  9510. <div class="content">
  9511. <pre class="highlight"><code>typedef shared_ptr&lt;void&gt; handle;
  9512. handle createProcess()
  9513. {
  9514. shared_ptr&lt;void&gt; pv(CreateProcess(), CloseHandle);
  9515. return pv;
  9516. }</code></pre>
  9517. </div>
  9518. </div>
  9519. </div>
  9520. <div class="sect2">
  9521. <h3 id="techniques_using_shared_ptr_to_execute_code_on_block_exit">Using shared_ptr to execute code on block exit</h3>
  9522. <div class="paragraph">
  9523. <p><code>shared_ptr&lt;void&gt;</code> can automatically execute cleanup code when control leaves a scope.</p>
  9524. </div>
  9525. <div class="ulist">
  9526. <ul>
  9527. <li>
  9528. <p>Executing <code>f(p)</code>, where <code>p</code> is a pointer:</p>
  9529. <div class="listingblock">
  9530. <div class="content">
  9531. <pre class="highlight"><code>shared_ptr&lt;void&gt; guard(p, f);</code></pre>
  9532. </div>
  9533. </div>
  9534. </li>
  9535. <li>
  9536. <p>Executing arbitrary code: <code>f(x, y)</code>:</p>
  9537. <div class="listingblock">
  9538. <div class="content">
  9539. <pre class="highlight"><code>shared_ptr&lt;void&gt; guard(static_cast&lt;void*&gt;(0), bind(f, x, y));</code></pre>
  9540. </div>
  9541. </div>
  9542. </li>
  9543. </ul>
  9544. </div>
  9545. </div>
  9546. <div class="sect2">
  9547. <h3 id="techniques_using_shared_ptrvoid_to_hold_an_arbitrary_object">Using shared_ptr&lt;void&gt; to hold an arbitrary object</h3>
  9548. <div class="paragraph">
  9549. <p><code>shared_ptr&lt;void&gt;</code> can act as a generic object pointer similar to <code>void*</code>. When a <code>shared_ptr&lt;void&gt;</code> instance constructed as:</p>
  9550. </div>
  9551. <div class="literalblock">
  9552. <div class="content">
  9553. <pre>shared_ptr&lt;void&gt; pv(new X);</pre>
  9554. </div>
  9555. </div>
  9556. <div class="paragraph">
  9557. <p>is destroyed, it will correctly dispose of the <code>X</code> object by executing <code>~X</code>.</p>
  9558. </div>
  9559. <div class="paragraph">
  9560. <p>This propery can be used in much the same manner as a raw <code>void*</code> is used to temporarily strip type information from an object pointer.
  9561. A <code>shared_ptr&lt;void&gt;</code> can later be cast back to the correct type by using <code><a href="#shared_ptr_static_pointer_cast">static_pointer_cast</a></code>.</p>
  9562. </div>
  9563. </div>
  9564. <div class="sect2">
  9565. <h3 id="techniques_associating_arbitrary_data_with_heterogeneous_shared_ptr_instances">Associating arbitrary data with heterogeneous <code>shared_ptr</code> instances</h3>
  9566. <div class="paragraph">
  9567. <p><code>shared_ptr</code> and <code>weak_ptr</code> support <code>operator&lt;</code> comparisons required by standard associative containers such as <code>std::map</code>. This can be
  9568. used to non-intrusively associate arbitrary data with objects managed by <code>shared_ptr</code>:</p>
  9569. </div>
  9570. <div class="listingblock">
  9571. <div class="content">
  9572. <pre class="highlight"><code>typedef int Data;
  9573. std::map&lt;shared_ptr&lt;void&gt;, Data&gt; userData;
  9574. // or std::map&lt;weak_ptr&lt;void&gt;, Data&gt; userData; to not affect the lifetime
  9575. shared_ptr&lt;X&gt; px(new X);
  9576. shared_ptr&lt;int&gt; pi(new int(3));
  9577. userData[px] = 42;
  9578. userData[pi] = 91;</code></pre>
  9579. </div>
  9580. </div>
  9581. </div>
  9582. <div class="sect2">
  9583. <h3 id="techniques_using_shared_ptr_as_a_copyconstructible_mutex_lock">Using <code>shared_ptr</code> as a <code>CopyConstructible</code> mutex lock</h3>
  9584. <div class="paragraph">
  9585. <p>Sometimes it&#8217;s necessary to return a mutex lock from a function, and a noncopyable lock cannot be returned by value. It is possible to use <code>shared_ptr</code> as a mutex lock:</p>
  9586. </div>
  9587. <div class="listingblock">
  9588. <div class="content">
  9589. <pre class="highlight"><code>class mutex
  9590. {
  9591. public:
  9592. void lock();
  9593. void unlock();
  9594. };
  9595. shared_ptr&lt;mutex&gt; lock(mutex &amp; m)
  9596. {
  9597. m.lock();
  9598. return shared_ptr&lt;mutex&gt;(&amp;m, mem_fn(&amp;mutex::unlock));
  9599. }</code></pre>
  9600. </div>
  9601. </div>
  9602. <div class="paragraph">
  9603. <p>Better yet, the <code>shared_ptr</code> instance acting as a lock can be encapsulated in a dedicated <code>shared_lock</code> class:</p>
  9604. </div>
  9605. <div class="listingblock">
  9606. <div class="content">
  9607. <pre class="highlight"><code>class shared_lock
  9608. {
  9609. private:
  9610. shared_ptr&lt;void&gt; pv;
  9611. public:
  9612. template&lt;class Mutex&gt; explicit shared_lock(Mutex &amp; m): pv((m.lock(), &amp;m), mem_fn(&amp;Mutex::unlock)) {}
  9613. };</code></pre>
  9614. </div>
  9615. </div>
  9616. <div class="paragraph">
  9617. <p><code>shared_lock</code> can now be used as:</p>
  9618. </div>
  9619. <div class="literalblock">
  9620. <div class="content">
  9621. <pre>shared_lock lock(m);</pre>
  9622. </div>
  9623. </div>
  9624. <div class="paragraph">
  9625. <p>Note that <code>shared_lock</code> is not templated on the mutex type, thanks to <code>shared_ptr&lt;void&gt;</code>&#8217;s ability to hide type information.</p>
  9626. </div>
  9627. </div>
  9628. <div class="sect2">
  9629. <h3 id="techniques_using_shared_ptr_to_wrap_member_function_calls">Using shared_ptr to wrap member function calls</h3>
  9630. <div class="paragraph">
  9631. <p><code>shared_ptr</code> implements the ownership semantics required from the <code>Wrap/CallProxy</code> scheme described in Bjarne Stroustrup&#8217;s article
  9632. "Wrapping C++ Member Function Calls" (available online at <a href="http://www.stroustrup.com/wrapper.pdf" class="bare">http://www.stroustrup.com/wrapper.pdf</a>). An implementation is given below:</p>
  9633. </div>
  9634. <div class="listingblock">
  9635. <div class="content">
  9636. <pre class="highlight"><code>template&lt;class T&gt; class pointer
  9637. {
  9638. private:
  9639. T * p_;
  9640. public:
  9641. explicit pointer(T * p): p_(p)
  9642. {
  9643. }
  9644. shared_ptr&lt;T&gt; operator-&gt;() const
  9645. {
  9646. p_-&gt;prefix();
  9647. return shared_ptr&lt;T&gt;(p_, mem_fn(&amp;T::suffix));
  9648. }
  9649. };
  9650. class X
  9651. {
  9652. private:
  9653. void prefix();
  9654. void suffix();
  9655. friend class pointer&lt;X&gt;;
  9656. public:
  9657. void f();
  9658. void g();
  9659. };
  9660. int main()
  9661. {
  9662. X x;
  9663. pointer&lt;X&gt; px(&amp;x);
  9664. px-&gt;f();
  9665. px-&gt;g();
  9666. }</code></pre>
  9667. </div>
  9668. </div>
  9669. </div>
  9670. <div class="sect2">
  9671. <h3 id="techniques_delayed_deallocation">Delayed deallocation</h3>
  9672. <div class="paragraph">
  9673. <p>In some situations, a single <code>px.reset()</code> can trigger an expensive deallocation in a performance-critical region:</p>
  9674. </div>
  9675. <div class="listingblock">
  9676. <div class="content">
  9677. <pre class="highlight"><code>class X; // ~X is expensive
  9678. class Y
  9679. {
  9680. shared_ptr&lt;X&gt; px;
  9681. public:
  9682. void f()
  9683. {
  9684. px.reset();
  9685. }
  9686. };</code></pre>
  9687. </div>
  9688. </div>
  9689. <div class="paragraph">
  9690. <p>The solution is to postpone the potential deallocation by moving <code>px</code> to a dedicated free list that can be periodically emptied when performance and response times are not an issue:</p>
  9691. </div>
  9692. <div class="listingblock">
  9693. <div class="content">
  9694. <pre class="highlight"><code>vector&lt; shared_ptr&lt;void&gt; &gt; free_list;
  9695. class Y
  9696. {
  9697. shared_ptr&lt;X&gt; px;
  9698. public:
  9699. void f()
  9700. {
  9701. free_list.push_back(px);
  9702. px.reset();
  9703. }
  9704. };
  9705. // periodically invoke free_list.clear() when convenient</code></pre>
  9706. </div>
  9707. </div>
  9708. <div class="paragraph">
  9709. <p>Another variation is to move the free list logic to the construction point by using a delayed deleter:</p>
  9710. </div>
  9711. <div class="listingblock">
  9712. <div class="content">
  9713. <pre class="highlight"><code>struct delayed_deleter
  9714. {
  9715. template&lt;class T&gt; void operator()(T * p)
  9716. {
  9717. try
  9718. {
  9719. shared_ptr&lt;void&gt; pv(p);
  9720. free_list.push_back(pv);
  9721. }
  9722. catch(...)
  9723. {
  9724. }
  9725. }
  9726. };</code></pre>
  9727. </div>
  9728. </div>
  9729. </div>
  9730. <div class="sect2">
  9731. <h3 id="techniques_weak_without_shared">Weak pointers to objects not managed by a shared_ptr</h3>
  9732. <div class="paragraph">
  9733. <p>Make the object hold a <code>shared_ptr</code> to itself, using a <code>null_deleter</code>:</p>
  9734. </div>
  9735. <div class="listingblock">
  9736. <div class="content">
  9737. <pre class="highlight"><code>class X
  9738. {
  9739. private:
  9740. shared_ptr&lt;X&gt; this_;
  9741. int i_;
  9742. public:
  9743. explicit X(int i): this_(this, null_deleter()), i_(i)
  9744. {
  9745. }
  9746. // repeat in all constructors (including the copy constructor!)
  9747. X(X const &amp; rhs): this_(this, null_deleter()), i_(rhs.i_)
  9748. {
  9749. }
  9750. // do not forget to not assign this_ in the copy assignment
  9751. X &amp; operator=(X const &amp; rhs)
  9752. {
  9753. i_ = rhs.i_;
  9754. }
  9755. weak_ptr&lt;X&gt; get_weak_ptr() const { return this_; }
  9756. };</code></pre>
  9757. </div>
  9758. </div>
  9759. <div class="paragraph">
  9760. <p>When the object&#8217;s lifetime ends, <code>X::this_</code> will be destroyed, and all weak pointers will automatically expire.</p>
  9761. </div>
  9762. </div>
  9763. </div>
  9764. </div>
  9765. <div class="sect1">
  9766. <h2 id="history">Appendix B: History and Acknowledgments</h2>
  9767. <div class="sectionbody">
  9768. <div class="sect2">
  9769. <h3 id="history_summer_1994">Summer 1994</h3>
  9770. <div class="paragraph">
  9771. <p>Greg Colvin <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0555.pdf">proposed</a>
  9772. to the C&#43;&#43; Standards Committee classes named <code>auto_ptr</code> and <code>counted_ptr</code> which were very
  9773. similar to what we now call <code>scoped_ptr</code> and <code>shared_ptr</code>. In one of the very few cases
  9774. where the Library Working Group&#8217;s recommendations were not followed by the full committee,
  9775. <code>counted_ptr</code> was rejected and surprising transfer-of-ownership semantics were added to <code>auto_ptr</code>.</p>
  9776. </div>
  9777. </div>
  9778. <div class="sect2">
  9779. <h3 id="history_october_1998">October 1998</h3>
  9780. <div class="paragraph">
  9781. <p>Beman Dawes proposed reviving the original semantics under the names <code>safe_ptr</code> and <code>counted_ptr</code>,
  9782. meeting of Per Andersson, Matt Austern, Greg Colvin, Sean Corfield, Pete Becker, Nico Josuttis,
  9783. Dietmar Kühl, Nathan Myers, Chichiang Wan and Judy Ward. During the discussion, the four new class
  9784. names were finalized, it was decided that there was no need to exactly follow the <code>std::auto_ptr</code>
  9785. interface, and various function signatures and semantics were finalized.</p>
  9786. </div>
  9787. <div class="paragraph">
  9788. <p>Over the next three months, several implementations were considered for <code>shared_ptr</code>, and discussed
  9789. on the <a href="http://www.boost.org/">boost.org</a> mailing list. The implementation questions revolved around
  9790. the reference count which must be kept, either attached to the pointed to object, or detached elsewhere.
  9791. Each of those variants have themselves two major variants:</p>
  9792. </div>
  9793. <div class="ulist">
  9794. <ul>
  9795. <li>
  9796. <p>Direct detached: the <code>shared_ptr</code> contains a pointer to the object, and a pointer to the count.</p>
  9797. </li>
  9798. <li>
  9799. <p>Indirect detached: the <code>shared_ptr</code> contains a pointer to a helper object, which in turn contains a pointer to the object and the count.</p>
  9800. </li>
  9801. <li>
  9802. <p>Embedded attached: the count is a member of the object pointed to.</p>
  9803. </li>
  9804. <li>
  9805. <p>Placement attached: the count is attached via operator new manipulations.</p>
  9806. </li>
  9807. </ul>
  9808. </div>
  9809. <div class="paragraph">
  9810. <p>Each implementation technique has advantages and disadvantages. We went so far as to run various timings
  9811. of the direct and indirect approaches, and found that at least on Intel Pentium chips there was very little
  9812. measurable difference. Kevlin Henney provided a paper he wrote on "Counted Body Techniques." Dietmar Kühl
  9813. suggested an elegant partial template specialization technique to allow users to choose which implementation
  9814. they preferred, and that was also experimented with.</p>
  9815. </div>
  9816. <div class="paragraph">
  9817. <p>But Greg Colvin and Jerry Schwarz argued that "parameterization will discourage users", and in the end we choose
  9818. to supply only the direct implementation.</p>
  9819. </div>
  9820. </div>
  9821. <div class="sect2">
  9822. <h3 id="history_may_1999">May 1999</h3>
  9823. <div class="paragraph">
  9824. <p>In April and May, 1999, Valentin Bonnard and David Abrahams made a number of suggestions resulting in numerous improvements.</p>
  9825. </div>
  9826. </div>
  9827. <div class="sect2">
  9828. <h3 id="history_september_1999">September 1999</h3>
  9829. <div class="paragraph">
  9830. <p>Luis Coelho provided <code>shared_ptr::swap</code> and <code>shared_array::swap</code>.</p>
  9831. </div>
  9832. </div>
  9833. <div class="sect2">
  9834. <h3 id="history_november_1999">November 1999</h3>
  9835. <div class="paragraph">
  9836. <p>Darin Adler provided <code>operator ==</code>, <code>operator !=</code>, and <code>std::swap</code> and <code>std::less</code> specializations for shared types.</p>
  9837. </div>
  9838. </div>
  9839. <div class="sect2">
  9840. <h3 id="history_may_2001">May 2001</h3>
  9841. <div class="paragraph">
  9842. <p>Vladimir Prus suggested requiring a complete type on destruction. Refinement evolved in discussions including Dave Abrahams,
  9843. Greg Colvin, Beman Dawes, Rainer Deyke, Peter Dimov, John Maddock, Vladimir Prus, Shankar Sai, and others.</p>
  9844. </div>
  9845. </div>
  9846. <div class="sect2">
  9847. <h3 id="history_january_2002">January 2002</h3>
  9848. <div class="paragraph">
  9849. <p>Peter Dimov reworked all four classes, adding features, fixing bugs, splitting them into four separate headers, and adding
  9850. <code>weak_ptr</code>.</p>
  9851. </div>
  9852. </div>
  9853. <div class="sect2">
  9854. <h3 id="history_march_2003">March 2003</h3>
  9855. <div class="paragraph">
  9856. <p>Peter Dimov, Beman Dawes and Greg Colvin <a href="http://open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html">proposed</a> <code>shared_ptr</code>
  9857. and <code>weak_ptr</code> for inclusion in the Standard Library via the first Library Technical Report (known as TR1). The proposal was
  9858. accepted and eventually went on to become a part of the C&#43;&#43; standard in its 2011 iteration.</p>
  9859. </div>
  9860. </div>
  9861. <div class="sect2">
  9862. <h3 id="history_july_2007">July 2007</h3>
  9863. <div class="paragraph">
  9864. <p>Peter Dimov and Beman Dawes <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2351.htm">proposed</a> a number of enhancements
  9865. to <code>shared_ptr</code> as it was entering the working paper that eventually became the C&#43;&#43;11 standard.</p>
  9866. </div>
  9867. </div>
  9868. <div class="sect2">
  9869. <h3 id="history_november_2012">November 2012</h3>
  9870. <div class="paragraph">
  9871. <p>Glen Fernandes provided implementations of <code>make_shared</code> and <code>allocate_shared</code> for arrays. They achieve a single allocation
  9872. for an array that can be initialized with constructor arguments or initializer lists as well as overloads for default initialization
  9873. and no value initialization.</p>
  9874. </div>
  9875. <div class="paragraph">
  9876. <p>Peter Dimov aided this development by extending <code>shared_ptr</code> to support arrays via the syntax <code>shared_ptr&lt;T[]&gt;</code> and <code>shared_ptr&lt;T[N]&gt;</code>.</p>
  9877. </div>
  9878. </div>
  9879. <div class="sect2">
  9880. <h3 id="history_april_2013">April 2013</h3>
  9881. <div class="paragraph">
  9882. <p>Peter Dimov <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3640.html">proposed</a> the extension of <code>shared_ptr</code> to support
  9883. arrays for inclusion into the standard, and it was accepted.</p>
  9884. </div>
  9885. </div>
  9886. <div class="sect2">
  9887. <h3 id="history_february_2014">February 2014</h3>
  9888. <div class="paragraph">
  9889. <p>Glen Fernandes updated <code>make_shared</code> and <code>allocate_shared</code> to conform to the specification in C&#43;&#43; standard paper
  9890. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html">N3870</a>, and implemented <code>make_unique</code> for arrays and objects.</p>
  9891. </div>
  9892. <div class="paragraph">
  9893. <p>Peter Dimov and Glen Fernandes updated the scalar and array implementations, respectively, to resolve C&#43;&#43; standard library defect 2070.</p>
  9894. </div>
  9895. </div>
  9896. <div class="sect2">
  9897. <h3 id="history_february_2017">February 2017</h3>
  9898. <div class="paragraph">
  9899. <p>Glen Fernandes rewrote <code>allocate_shared</code> and <code>make_shared</code> for arrays for a more optimal and more maintainable implementation.</p>
  9900. </div>
  9901. </div>
  9902. <div class="sect2">
  9903. <h3 id="history_june_2017">June 2017</h3>
  9904. <div class="paragraph">
  9905. <p>Peter Dimov and Glen Fernandes rewrote the documentation in Asciidoc format.</p>
  9906. </div>
  9907. <div class="paragraph">
  9908. <p>Peter Dimov added <code>atomic_shared_ptr</code> and <code>local_shared_ptr</code>.</p>
  9909. </div>
  9910. </div>
  9911. <div class="sect2">
  9912. <h3 id="history_august_2019">August 2019</h3>
  9913. <div class="paragraph">
  9914. <p>Glen Fernandes implemented <code>allocate_unique</code> for scalars and arrays.</p>
  9915. </div>
  9916. </div>
  9917. </div>
  9918. </div>
  9919. <div class="sect1">
  9920. <h2 id="shared_array">Appendix C: shared_array (deprecated)</h2>
  9921. <div class="sectionbody">
  9922. <div class="admonitionblock note">
  9923. <table>
  9924. <tr>
  9925. <td class="icon">
  9926. <div class="title">Note</div>
  9927. </td>
  9928. <td class="content">
  9929. This facility is deprecated because a <code>shared_ptr</code> to <code>T[]</code> or <code>T[N]</code>
  9930. is now available, and is superior in every regard.
  9931. </td>
  9932. </tr>
  9933. </table>
  9934. </div>
  9935. <div class="sect2">
  9936. <h3 id="shared_array_description">Description</h3>
  9937. <div class="paragraph">
  9938. <p>The <code>shared_array</code> class template stores a pointer to a dynamically allocated
  9939. array. (Dynamically allocated array are allocated with the C++ <code>new[]</code>
  9940. expression.) The object pointed to is guaranteed to be deleted when the last
  9941. <code>shared_array</code> pointing to it is destroyed or reset.</p>
  9942. </div>
  9943. <div class="paragraph">
  9944. <p>Every <code>shared_array</code> meets the <em>CopyConstructible</em> and <em>Assignable</em>
  9945. requirements of the C&#43;&#43; Standard Library, and so can be used in standard
  9946. library containers. Comparison operators are supplied so that shared_array
  9947. works with the standard library&#8217;s associative containers.</p>
  9948. </div>
  9949. <div class="paragraph">
  9950. <p>Normally, a <code>shared_array</code> cannot correctly hold a pointer to an object that
  9951. has been allocated with the non-array form of <code>new</code>. See <code>shared_ptr</code> for that
  9952. usage.</p>
  9953. </div>
  9954. <div class="paragraph">
  9955. <p>Because the implementation uses reference counting, cycles of <code>shared_array</code>
  9956. instances will not be reclaimed. For example, if <code>main</code> holds a shared_array
  9957. to <code>A</code>, which directly or indirectly holds a shared_array back to <code>A</code>, the use
  9958. count of <code>A</code> will be 2. Destruction of the original <code>shared_array</code> will leave
  9959. <code>A</code> dangling with a use count of 1.</p>
  9960. </div>
  9961. <div class="paragraph">
  9962. <p>A <code>shared_ptr</code> to a <code>std::vector</code> is an alternative to a <code>shared_array</code> that
  9963. is a bit heavier duty but far more flexible.</p>
  9964. </div>
  9965. <div class="paragraph">
  9966. <p>The class template is parameterized on <code>T</code>, the type of the object pointed to.
  9967. <code>shared_array</code> and most of its member functions place no requirements on <code>T</code>;
  9968. it is allowed to be an incomplete type, or <code>void</code>. Member functions that do
  9969. place additional requirements (constructors, reset) are explicitly documented
  9970. below.</p>
  9971. </div>
  9972. </div>
  9973. <div class="sect2">
  9974. <h3 id="shared_array_synopsis">Synopsis</h3>
  9975. <div class="listingblock">
  9976. <div class="content">
  9977. <pre class="highlight"><code>namespace boost {
  9978. template&lt;class T&gt; class shared_array {
  9979. public:
  9980. typedef T element_type;
  9981. explicit shared_array(T* p = 0);
  9982. template&lt;class D&gt; shared_array(T* p, D d);
  9983. shared_array(const shared_array&amp; v) noexcept;
  9984. ~shared_array() noexcept;
  9985. shared_array&amp; operator=(const shared_array&amp; v) noexcept;
  9986. void reset(T* p = 0);
  9987. template&lt;class D&gt; void reset(T* p, D d);
  9988. T&amp; operator[](std::ptrdiff_t n) const noexcept;
  9989. T* get() const noexcept;
  9990. bool unique() const noexcept;
  9991. long use_count() const noexcept;
  9992. explicit operator bool() const noexcept;
  9993. void swap(shared_array&lt;T&gt;&amp; v) noexcept;
  9994. };
  9995. template&lt;class T&gt; bool
  9996. operator==(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;
  9997. template&lt;class T&gt; bool
  9998. operator!=(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;
  9999. template&lt;class T&gt; bool
  10000. operator&lt;(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;
  10001. template&lt;class T&gt;
  10002. void swap(shared_array&lt;T&gt;&amp; a, shared_array&lt;T&gt;&amp; b) noexcept;
  10003. }</code></pre>
  10004. </div>
  10005. </div>
  10006. </div>
  10007. <div class="sect2">
  10008. <h3 id="shared_array_members">Members</h3>
  10009. <div class="sect3">
  10010. <h4 id="shared_array_element_type">element_type</h4>
  10011. <div class="listingblock">
  10012. <div class="content">
  10013. <pre class="highlight"><code>typedef T element_type;</code></pre>
  10014. </div>
  10015. </div>
  10016. <div class="dlist">
  10017. <dl>
  10018. <dt class="hdlist1">Type</dt>
  10019. <dd>
  10020. <p>Provides the type of the stored pointer.</p>
  10021. </dd>
  10022. </dl>
  10023. </div>
  10024. </div>
  10025. <div class="sect3">
  10026. <h4 id="shared_array_constructors">Constructors</h4>
  10027. <div class="listingblock">
  10028. <div class="content">
  10029. <pre class="highlight"><code>explicit shared_array(T* p = 0);</code></pre>
  10030. </div>
  10031. </div>
  10032. <div class="ulist none">
  10033. <ul class="none">
  10034. <li>
  10035. <p></p>
  10036. <div class="dlist">
  10037. <dl>
  10038. <dt class="hdlist1">Effects</dt>
  10039. <dd>
  10040. <p>Constructs a <code>shared_array</code>, storing a copy of <code>p</code>, which must be a
  10041. pointer to an array that was allocated via a C++ <code>new[]</code> expression or be 0.
  10042. Afterwards, the use count is 1 (even if <code>p == 0</code>; see <code>~shared_array</code>).</p>
  10043. </dd>
  10044. <dt class="hdlist1">Requires</dt>
  10045. <dd>
  10046. <p><code>T</code> is a complete type.</p>
  10047. </dd>
  10048. <dt class="hdlist1">Throws</dt>
  10049. <dd>
  10050. <p><code>std::bad_alloc</code>. If an exception is thrown, <code>delete[] p</code> is called.</p>
  10051. </dd>
  10052. </dl>
  10053. </div>
  10054. </li>
  10055. </ul>
  10056. </div>
  10057. <div class="listingblock">
  10058. <div class="content">
  10059. <pre class="highlight"><code>template&lt;class D&gt; shared_array(T* p, D d);</code></pre>
  10060. </div>
  10061. </div>
  10062. <div class="ulist none">
  10063. <ul class="none">
  10064. <li>
  10065. <p></p>
  10066. <div class="dlist">
  10067. <dl>
  10068. <dt class="hdlist1">Effects</dt>
  10069. <dd>
  10070. <p>Constructs a <code>shared_array</code>, storing a copy of <code>p</code> and of <code>d</code>.
  10071. Afterwards, the use count is 1. When the the time comes to delete the array
  10072. pointed to by <code>p</code>, the object <code>d</code> is used in the statement <code>d(p)</code>.</p>
  10073. </dd>
  10074. <dt class="hdlist1">Requires</dt>
  10075. </dl>
  10076. </div>
  10077. </li>
  10078. <li>
  10079. <p><code>T</code> is a complete type.</p>
  10080. </li>
  10081. <li>
  10082. <p>The copy constructor and destructor of <code>D</code> must not throw.</p>
  10083. </li>
  10084. <li>
  10085. <p>Invoking the object <code>d</code> with parameter <code>p</code> must not throw.</p>
  10086. <div class="dlist">
  10087. <dl>
  10088. <dt class="hdlist1">Throws</dt>
  10089. <dd>
  10090. <p><code>std::bad_alloc</code>. If an exception is thrown, <code>d(p)</code> is called.</p>
  10091. </dd>
  10092. </dl>
  10093. </div>
  10094. </li>
  10095. </ul>
  10096. </div>
  10097. <div class="listingblock">
  10098. <div class="content">
  10099. <pre class="highlight"><code>shared_array(const shared_array&amp; v) noexcept;</code></pre>
  10100. </div>
  10101. </div>
  10102. <div class="ulist none">
  10103. <ul class="none">
  10104. <li>
  10105. <p></p>
  10106. <div class="dlist">
  10107. <dl>
  10108. <dt class="hdlist1">Effects</dt>
  10109. <dd>
  10110. <p>Constructs a <code>shared_array</code>, as if by storing a copy of the pointer
  10111. stored in <code>v</code>. Afterwards, the use count for all copies is 1 more than the
  10112. initial use count.</p>
  10113. </dd>
  10114. <dt class="hdlist1">Requires</dt>
  10115. <dd>
  10116. <p><code>T</code> is a complete type.</p>
  10117. </dd>
  10118. </dl>
  10119. </div>
  10120. </li>
  10121. </ul>
  10122. </div>
  10123. </div>
  10124. <div class="sect3">
  10125. <h4 id="shared_array_destructor">Destructor</h4>
  10126. <div class="listingblock">
  10127. <div class="content">
  10128. <pre class="highlight"><code>~shared_array() noexcept;</code></pre>
  10129. </div>
  10130. </div>
  10131. <div class="ulist none">
  10132. <ul class="none">
  10133. <li>
  10134. <p></p>
  10135. <div class="dlist">
  10136. <dl>
  10137. <dt class="hdlist1">Effects</dt>
  10138. <dd>
  10139. <p>Decrements the use count. Then, if the use count is 0, deletes the
  10140. array pointed to by the stored pointer. Note that <code>delete[]</code> on a pointer with
  10141. a value of 0 is harmless.</p>
  10142. </dd>
  10143. </dl>
  10144. </div>
  10145. </li>
  10146. </ul>
  10147. </div>
  10148. </div>
  10149. <div class="sect3">
  10150. <h4 id="shared_array_assignment">Assignment</h4>
  10151. <div class="listingblock">
  10152. <div class="content">
  10153. <pre class="highlight"><code>shared_array&amp; operator=(const shared_array&amp; v) noexcept;</code></pre>
  10154. </div>
  10155. </div>
  10156. <div class="ulist none">
  10157. <ul class="none">
  10158. <li>
  10159. <p></p>
  10160. <div class="dlist">
  10161. <dl>
  10162. <dt class="hdlist1">Effects</dt>
  10163. <dd>
  10164. <p>Constructs a new <code>shared_array</code> as described above, then replaces
  10165. this <code>shared_array</code> with the new one, destroying the replaced object.</p>
  10166. </dd>
  10167. <dt class="hdlist1">Requires</dt>
  10168. <dd>
  10169. <p><code>T</code> is a complete type.</p>
  10170. </dd>
  10171. <dt class="hdlist1">Returns</dt>
  10172. <dd>
  10173. <p><code>*this</code>.</p>
  10174. </dd>
  10175. </dl>
  10176. </div>
  10177. </li>
  10178. </ul>
  10179. </div>
  10180. </div>
  10181. <div class="sect3">
  10182. <h4 id="shared_array_reset">reset</h4>
  10183. <div class="listingblock">
  10184. <div class="content">
  10185. <pre class="highlight"><code>void reset(T* p = 0);</code></pre>
  10186. </div>
  10187. </div>
  10188. <div class="ulist none">
  10189. <ul class="none">
  10190. <li>
  10191. <p></p>
  10192. <div class="dlist">
  10193. <dl>
  10194. <dt class="hdlist1">Effects</dt>
  10195. <dd>
  10196. <p>Constructs a new <code>shared_array</code> as described above, then replaces
  10197. this <code>shared_array</code> with the new one, destroying the replaced object.</p>
  10198. </dd>
  10199. <dt class="hdlist1">Requires</dt>
  10200. <dd>
  10201. <p><code>T</code> is a complete type.</p>
  10202. </dd>
  10203. <dt class="hdlist1">Throws</dt>
  10204. <dd>
  10205. <p><code>std::bad_alloc</code>. If an exception is thrown, <code>delete[] p</code> is called.</p>
  10206. </dd>
  10207. </dl>
  10208. </div>
  10209. </li>
  10210. </ul>
  10211. </div>
  10212. <div class="listingblock">
  10213. <div class="content">
  10214. <pre class="highlight"><code>template&lt;class D&gt; void reset(T* p, D d);</code></pre>
  10215. </div>
  10216. </div>
  10217. <div class="ulist none">
  10218. <ul class="none">
  10219. <li>
  10220. <p></p>
  10221. <div class="dlist">
  10222. <dl>
  10223. <dt class="hdlist1">Effects</dt>
  10224. <dd>
  10225. <p>Constructs a new <code>shared_array</code> as described above, then replaces
  10226. this <code>shared_array</code> with the new one, destroying the replaced object.</p>
  10227. </dd>
  10228. <dt class="hdlist1">Requires</dt>
  10229. </dl>
  10230. </div>
  10231. </li>
  10232. <li>
  10233. <p><code>T</code> is a complete type.</p>
  10234. </li>
  10235. <li>
  10236. <p>The copy constructor of <code>D</code> must not throw.</p>
  10237. <div class="dlist">
  10238. <dl>
  10239. <dt class="hdlist1">Throws</dt>
  10240. <dd>
  10241. <p><code>std::bad_alloc</code>. If an exception is thrown, <code>d(p)</code> is called.</p>
  10242. </dd>
  10243. </dl>
  10244. </div>
  10245. </li>
  10246. </ul>
  10247. </div>
  10248. </div>
  10249. <div class="sect3">
  10250. <h4 id="shared_array_indexing">Indexing</h4>
  10251. <div class="listingblock">
  10252. <div class="content">
  10253. <pre class="highlight"><code>T&amp; operator[](std::ptrdiff_t n) const noexcept;</code></pre>
  10254. </div>
  10255. </div>
  10256. <div class="dlist">
  10257. <dl>
  10258. <dt class="hdlist1">Returns</dt>
  10259. <dd>
  10260. <p>A reference to element <code>n</code> of the array pointed to by the stored
  10261. pointer. Behavior is undefined and almost certainly undesirable if the stored
  10262. pointer is 0, or if <code>n</code> is less than 0 or is greater than or equal to the
  10263. number of elements in the array.</p>
  10264. </dd>
  10265. <dt class="hdlist1">Requires</dt>
  10266. <dd>
  10267. <p><code>T</code> is a complete type.</p>
  10268. </dd>
  10269. </dl>
  10270. </div>
  10271. </div>
  10272. <div class="sect3">
  10273. <h4 id="shared_array_get">get</h4>
  10274. <div class="listingblock">
  10275. <div class="content">
  10276. <pre class="highlight"><code>T* get() const noexcept;</code></pre>
  10277. </div>
  10278. </div>
  10279. <div class="ulist none">
  10280. <ul class="none">
  10281. <li>
  10282. <p></p>
  10283. <div class="dlist">
  10284. <dl>
  10285. <dt class="hdlist1">Returns</dt>
  10286. <dd>
  10287. <p>The stored pointer.</p>
  10288. </dd>
  10289. </dl>
  10290. </div>
  10291. </li>
  10292. </ul>
  10293. </div>
  10294. </div>
  10295. <div class="sect3">
  10296. <h4 id="shared_array_unique">unique</h4>
  10297. <div class="listingblock">
  10298. <div class="content">
  10299. <pre class="highlight"><code>bool unique() const noexcept;</code></pre>
  10300. </div>
  10301. </div>
  10302. <div class="ulist none">
  10303. <ul class="none">
  10304. <li>
  10305. <p></p>
  10306. <div class="dlist">
  10307. <dl>
  10308. <dt class="hdlist1">Returns</dt>
  10309. <dd>
  10310. <p><code>true</code> if no other <code>shared_array</code> is sharing ownership of the
  10311. stored pointer, <code>false</code> otherwise.</p>
  10312. </dd>
  10313. </dl>
  10314. </div>
  10315. </li>
  10316. </ul>
  10317. </div>
  10318. </div>
  10319. <div class="sect3">
  10320. <h4 id="shared_array_use_count">use_count</h4>
  10321. <div class="listingblock">
  10322. <div class="content">
  10323. <pre class="highlight"><code>long use_count() const noexcept;</code></pre>
  10324. </div>
  10325. </div>
  10326. <div class="ulist none">
  10327. <ul class="none">
  10328. <li>
  10329. <p></p>
  10330. <div class="dlist">
  10331. <dl>
  10332. <dt class="hdlist1">Returns</dt>
  10333. <dd>
  10334. <p>The number of <code>shared_array</code> objects sharing ownership of the
  10335. stored pointer.</p>
  10336. </dd>
  10337. </dl>
  10338. </div>
  10339. </li>
  10340. </ul>
  10341. </div>
  10342. </div>
  10343. <div class="sect3">
  10344. <h4 id="shared_array_conversions">Conversions</h4>
  10345. <div class="listingblock">
  10346. <div class="content">
  10347. <pre class="highlight"><code>explicit operator bool() const noexcept;</code></pre>
  10348. </div>
  10349. </div>
  10350. <div class="ulist none">
  10351. <ul class="none">
  10352. <li>
  10353. <p></p>
  10354. <div class="dlist">
  10355. <dl>
  10356. <dt class="hdlist1">Returns</dt>
  10357. <dd>
  10358. <p><code>get() != 0</code>.</p>
  10359. </dd>
  10360. <dt class="hdlist1">Requires</dt>
  10361. <dd>
  10362. <p><code>T</code> is a complete type.</p>
  10363. </dd>
  10364. </dl>
  10365. </div>
  10366. </li>
  10367. </ul>
  10368. </div>
  10369. </div>
  10370. <div class="sect3">
  10371. <h4 id="shared_array_swap">swap</h4>
  10372. <div class="listingblock">
  10373. <div class="content">
  10374. <pre class="highlight"><code>void swap(shared_array&lt;T&gt;&amp; b) noexcept;</code></pre>
  10375. </div>
  10376. </div>
  10377. <div class="ulist none">
  10378. <ul class="none">
  10379. <li>
  10380. <p></p>
  10381. <div class="dlist">
  10382. <dl>
  10383. <dt class="hdlist1">Effects</dt>
  10384. <dd>
  10385. <p>Exchanges the contents of the two smart pointers.</p>
  10386. </dd>
  10387. </dl>
  10388. </div>
  10389. </li>
  10390. </ul>
  10391. </div>
  10392. </div>
  10393. </div>
  10394. <div class="sect2">
  10395. <h3 id="shared_array_free_functions">Free Functions</h3>
  10396. <div class="sect3">
  10397. <h4 id="shared_array_comparison">Comparison</h4>
  10398. <div class="listingblock">
  10399. <div class="content">
  10400. <pre class="highlight"><code>template&lt;class T&gt; bool
  10401. operator==(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;</code></pre>
  10402. </div>
  10403. </div>
  10404. <div class="listingblock">
  10405. <div class="content">
  10406. <pre class="highlight"><code>template&lt;class T&gt; bool
  10407. operator!=(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;</code></pre>
  10408. </div>
  10409. </div>
  10410. <div class="listingblock">
  10411. <div class="content">
  10412. <pre class="highlight"><code>template&lt;class T&gt; bool
  10413. operator&lt;(const shared_array&lt;T&gt;&amp; a, const shared_array&lt;T&gt;&amp; b) noexcept;</code></pre>
  10414. </div>
  10415. </div>
  10416. <div class="ulist none">
  10417. <ul class="none">
  10418. <li>
  10419. <p></p>
  10420. <div class="dlist">
  10421. <dl>
  10422. <dt class="hdlist1">Returns</dt>
  10423. <dd>
  10424. <p>The result of comparing the stored pointers of the two smart
  10425. pointers.</p>
  10426. </dd>
  10427. </dl>
  10428. </div>
  10429. </li>
  10430. </ul>
  10431. </div>
  10432. <div class="admonitionblock note">
  10433. <table>
  10434. <tr>
  10435. <td class="icon">
  10436. <div class="title">Note</div>
  10437. </td>
  10438. <td class="content">
  10439. The <code>operator&lt;</code> overload is provided to define an ordering so that
  10440. <code>shared_array</code> objects can be used in associative containers such as
  10441. <code>std::map</code>. The implementation uses <code>std::less&lt;T*&gt;</code> to perform the comparison.
  10442. This ensures that the comparison is handled correctly, since the standard
  10443. mandates that relational operations on pointers are unspecified (5.9
  10444. [expr.rel] paragraph 2) but <code>std::less</code> on pointers is well-defined (20.3.3
  10445. [lib.comparisons] paragraph 8).
  10446. </td>
  10447. </tr>
  10448. </table>
  10449. </div>
  10450. </div>
  10451. <div class="sect3">
  10452. <h4 id="shared_array_swap_2">swap</h4>
  10453. <div class="listingblock">
  10454. <div class="content">
  10455. <pre class="highlight"><code>template&lt;class T&gt;
  10456. void swap(shared_array&lt;T&gt;&amp; a, shared_array&lt;T&gt;&amp; b) noexcept;</code></pre>
  10457. </div>
  10458. </div>
  10459. <div class="ulist none">
  10460. <ul class="none">
  10461. <li>
  10462. <p></p>
  10463. <div class="dlist">
  10464. <dl>
  10465. <dt class="hdlist1">Returns</dt>
  10466. <dd>
  10467. <p><code>a.swap(b)</code>.</p>
  10468. </dd>
  10469. <dt class="hdlist1">Requires</dt>
  10470. <dd>
  10471. <p><code>T</code> is a complete type.</p>
  10472. </dd>
  10473. </dl>
  10474. </div>
  10475. </li>
  10476. </ul>
  10477. </div>
  10478. </div>
  10479. </div>
  10480. </div>
  10481. </div>
  10482. <div class="sect1">
  10483. <h2 id="copyright">Appendix D: Copyright and License</h2>
  10484. <div class="sectionbody">
  10485. <div class="paragraph">
  10486. <p>This documentation is</p>
  10487. </div>
  10488. <div class="ulist">
  10489. <ul>
  10490. <li>
  10491. <p>Copyright 1999 Greg Colvin</p>
  10492. </li>
  10493. <li>
  10494. <p>Copyright 1999 Beman Dawes</p>
  10495. </li>
  10496. <li>
  10497. <p>Copyright 2002 Darin Adler</p>
  10498. </li>
  10499. <li>
  10500. <p>Copyright 2003-2017 Peter Dimov</p>
  10501. </li>
  10502. <li>
  10503. <p>Copyright 2005, 2006 Ion Gaztañaga</p>
  10504. </li>
  10505. <li>
  10506. <p>Copyright 2008 Frank Mori Hess</p>
  10507. </li>
  10508. <li>
  10509. <p>Copyright 2012-2017 Glen Fernandes</p>
  10510. </li>
  10511. <li>
  10512. <p>Copyright 2013 Andrey Semashev</p>
  10513. </li>
  10514. </ul>
  10515. </div>
  10516. <div class="paragraph">
  10517. <p>and is distributed under the <a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License, Version 1.0</a>.</p>
  10518. </div>
  10519. </div>
  10520. </div>
  10521. </div>
  10522. <div id="footer">
  10523. <div id="footer-text">
  10524. Last updated 2019-12-10 00:19:52 UTC
  10525. </div>
  10526. </div>
  10527. <style>
  10528. *:not(pre)>code { background: none; color: #600000; }
  10529. table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
  10530. </style>
  10531. </body>
  10532. </html>