• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?xml version="1.0" encoding="utf-8" ?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
7<title>Boost Pointer Container Library</title>
8<style type="text/css">
9
10/*
11:Author: David Goodger (goodger@python.org)
12:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
13:Copyright: This stylesheet has been placed in the public domain.
14
15Default cascading style sheet for the HTML output of Docutils.
16
17See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
18customize this style sheet.
19*/
20
21/* used to remove borders from tables and images */
22.borderless, table.borderless td, table.borderless th {
23  border: 0 }
24
25table.borderless td, table.borderless th {
26  /* Override padding for "table.docutils td" with "! important".
27     The right padding separates the table cells. */
28  padding: 0 0.5em 0 0 ! important }
29
30.first {
31  /* Override more specific margin styles with "! important". */
32  margin-top: 0 ! important }
33
34.last, .with-subtitle {
35  margin-bottom: 0 ! important }
36
37.hidden {
38  display: none }
39
40.subscript {
41  vertical-align: sub;
42  font-size: smaller }
43
44.superscript {
45  vertical-align: super;
46  font-size: smaller }
47
48a.toc-backref {
49  text-decoration: none ;
50  color: black }
51
52blockquote.epigraph {
53  margin: 2em 5em ; }
54
55dl.docutils dd {
56  margin-bottom: 0.5em }
57
58object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
59  overflow: hidden;
60}
61
62/* Uncomment (and remove this text!) to get bold-faced definition list terms
63dl.docutils dt {
64  font-weight: bold }
65*/
66
67div.abstract {
68  margin: 2em 5em }
69
70div.abstract p.topic-title {
71  font-weight: bold ;
72  text-align: center }
73
74div.admonition, div.attention, div.caution, div.danger, div.error,
75div.hint, div.important, div.note, div.tip, div.warning {
76  margin: 2em ;
77  border: medium outset ;
78  padding: 1em }
79
80div.admonition p.admonition-title, div.hint p.admonition-title,
81div.important p.admonition-title, div.note p.admonition-title,
82div.tip p.admonition-title {
83  font-weight: bold ;
84  font-family: sans-serif }
85
86div.attention p.admonition-title, div.caution p.admonition-title,
87div.danger p.admonition-title, div.error p.admonition-title,
88div.warning p.admonition-title, .code .error {
89  color: red ;
90  font-weight: bold ;
91  font-family: sans-serif }
92
93/* Uncomment (and remove this text!) to get reduced vertical space in
94   compound paragraphs.
95div.compound .compound-first, div.compound .compound-middle {
96  margin-bottom: 0.5em }
97
98div.compound .compound-last, div.compound .compound-middle {
99  margin-top: 0.5em }
100*/
101
102div.dedication {
103  margin: 2em 5em ;
104  text-align: center ;
105  font-style: italic }
106
107div.dedication p.topic-title {
108  font-weight: bold ;
109  font-style: normal }
110
111div.figure {
112  margin-left: 2em ;
113  margin-right: 2em }
114
115div.footer, div.header {
116  clear: both;
117  font-size: smaller }
118
119div.line-block {
120  display: block ;
121  margin-top: 1em ;
122  margin-bottom: 1em }
123
124div.line-block div.line-block {
125  margin-top: 0 ;
126  margin-bottom: 0 ;
127  margin-left: 1.5em }
128
129div.sidebar {
130  margin: 0 0 0.5em 1em ;
131  border: medium outset ;
132  padding: 1em ;
133  background-color: #ffffee ;
134  width: 40% ;
135  float: right ;
136  clear: right }
137
138div.sidebar p.rubric {
139  font-family: sans-serif ;
140  font-size: medium }
141
142div.system-messages {
143  margin: 5em }
144
145div.system-messages h1 {
146  color: red }
147
148div.system-message {
149  border: medium outset ;
150  padding: 1em }
151
152div.system-message p.system-message-title {
153  color: red ;
154  font-weight: bold }
155
156div.topic {
157  margin: 2em }
158
159h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
160h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
161  margin-top: 0.4em }
162
163h1.title {
164  text-align: center }
165
166h2.subtitle {
167  text-align: center }
168
169hr.docutils {
170  width: 75% }
171
172img.align-left, .figure.align-left, object.align-left, table.align-left {
173  clear: left ;
174  float: left ;
175  margin-right: 1em }
176
177img.align-right, .figure.align-right, object.align-right, table.align-right {
178  clear: right ;
179  float: right ;
180  margin-left: 1em }
181
182img.align-center, .figure.align-center, object.align-center {
183  display: block;
184  margin-left: auto;
185  margin-right: auto;
186}
187
188table.align-center {
189  margin-left: auto;
190  margin-right: auto;
191}
192
193.align-left {
194  text-align: left }
195
196.align-center {
197  clear: both ;
198  text-align: center }
199
200.align-right {
201  text-align: right }
202
203/* reset inner alignment in figures */
204div.align-right {
205  text-align: inherit }
206
207/* div.align-center * { */
208/*   text-align: left } */
209
210.align-top    {
211  vertical-align: top }
212
213.align-middle {
214  vertical-align: middle }
215
216.align-bottom {
217  vertical-align: bottom }
218
219ol.simple, ul.simple {
220  margin-bottom: 1em }
221
222ol.arabic {
223  list-style: decimal }
224
225ol.loweralpha {
226  list-style: lower-alpha }
227
228ol.upperalpha {
229  list-style: upper-alpha }
230
231ol.lowerroman {
232  list-style: lower-roman }
233
234ol.upperroman {
235  list-style: upper-roman }
236
237p.attribution {
238  text-align: right ;
239  margin-left: 50% }
240
241p.caption {
242  font-style: italic }
243
244p.credits {
245  font-style: italic ;
246  font-size: smaller }
247
248p.label {
249  white-space: nowrap }
250
251p.rubric {
252  font-weight: bold ;
253  font-size: larger ;
254  color: maroon ;
255  text-align: center }
256
257p.sidebar-title {
258  font-family: sans-serif ;
259  font-weight: bold ;
260  font-size: larger }
261
262p.sidebar-subtitle {
263  font-family: sans-serif ;
264  font-weight: bold }
265
266p.topic-title {
267  font-weight: bold }
268
269pre.address {
270  margin-bottom: 0 ;
271  margin-top: 0 ;
272  font: inherit }
273
274pre.literal-block, pre.doctest-block, pre.math, pre.code {
275  margin-left: 2em ;
276  margin-right: 2em }
277
278pre.code .ln { color: grey; } /* line numbers */
279pre.code, code { background-color: #eeeeee }
280pre.code .comment, code .comment { color: #5C6576 }
281pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
282pre.code .literal.string, code .literal.string { color: #0C5404 }
283pre.code .name.builtin, code .name.builtin { color: #352B84 }
284pre.code .deleted, code .deleted { background-color: #DEB0A1}
285pre.code .inserted, code .inserted { background-color: #A3D289}
286
287span.classifier {
288  font-family: sans-serif ;
289  font-style: oblique }
290
291span.classifier-delimiter {
292  font-family: sans-serif ;
293  font-weight: bold }
294
295span.interpreted {
296  font-family: sans-serif }
297
298span.option {
299  white-space: nowrap }
300
301span.pre {
302  white-space: pre }
303
304span.problematic {
305  color: red }
306
307span.section-subtitle {
308  /* font-size relative to parent (h1..h6 element) */
309  font-size: 80% }
310
311table.citation {
312  border-left: solid 1px gray;
313  margin-left: 1px }
314
315table.docinfo {
316  margin: 2em 4em }
317
318table.docutils {
319  margin-top: 0.5em ;
320  margin-bottom: 0.5em }
321
322table.footnote {
323  border-left: solid 1px black;
324  margin-left: 1px }
325
326table.docutils td, table.docutils th,
327table.docinfo td, table.docinfo th {
328  padding-left: 0.5em ;
329  padding-right: 0.5em ;
330  vertical-align: top }
331
332table.docutils th.field-name, table.docinfo th.docinfo-name {
333  font-weight: bold ;
334  text-align: left ;
335  white-space: nowrap ;
336  padding-left: 0 }
337
338/* "booktabs" style (no vertical lines) */
339table.docutils.booktabs {
340  border: 0px;
341  border-top: 2px solid;
342  border-bottom: 2px solid;
343  border-collapse: collapse;
344}
345table.docutils.booktabs * {
346  border: 0px;
347}
348table.docutils.booktabs th {
349  border-bottom: thin solid;
350  text-align: left;
351}
352
353h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
354h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
355  font-size: 100% }
356
357ul.auto-toc {
358  list-style-type: none }
359
360</style>
361</head>
362<body>
363<div class="document" id="boost-pointer-container-library">
364<h1 class="title"><img alt="Boost" src="boost.png" /> Pointer Container Library</h1>
365<h2 class="subtitle" id="compatible-smart-pointer-type">Compatible Smart Pointer Type</h2>
366
367<p>When specifying parameter or return types in interfaces, the documentation
368for this library uses the pseudo-type</p>
369<pre class="literal-block">
370<em>compatible-smart-ptr</em>&lt;T&gt;
371</pre>
372<p>to indicate that the compiler C++ standard is being used to
373selectively provide or remove interfaces with <tt class="docutils literal"><span class="pre">std::auto_ptr&lt;T&gt;</span></tt> or
374<tt class="docutils literal"><span class="pre">std::unique_ptr&lt;T&gt;</span></tt>. The exact meaning varies depending on whether
375the smart pointer type is a parameter or a return type.</p>
376<p><strong>Parameter Types:</strong></p>
377<p>An interface such as</p>
378<pre class="literal-block">
379void container::push_back( <em>compatible-smart-ptr</em>&lt;T&gt; );
380</pre>
381<p>indicates that an overload of <tt class="docutils literal"><span class="pre">container::push_back</span></tt> is present for
382one or both of <tt class="docutils literal"><span class="pre">std::auto_ptr&lt;T&gt;</span></tt>, <tt class="docutils literal"><span class="pre">std::unique_ptr&lt;T&gt;</span></tt>;
383Boost.Pointer Container provides an overload for each type supported
384by the compiler. To be completely explicit, if the compiler provides
385<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt>, then</p>
386<pre class="literal-block">
387void container::push_back( std::auto_ptr&lt;T&gt; );
388</pre>
389<p>is present. If the compiler provides <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>, then</p>
390<pre class="literal-block">
391void container::push_back( std::unique_ptr&lt;T&gt; );
392</pre>
393<p>is present. And if the compiler provides both, both overloads are
394present.</p>
395<p>In practice this means that C++98/03 users have access to
396<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> overloads, C++11/14 users have access to
397overloads taking both <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> and <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>, and
398users of C++17 and onwards only have access to <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>
399overloads.</p>
400<p>The convention outlined above implies that in certain cases the
401documentation will make reference to a single function taking the
402compatible smart pointer pseudo parameter, when in fact two distinct
403overloaded functions are present. Of course the actual interface
404depends on compiler settings, so for clarity the <a class="reference external" href="reversible_ptr_container.html">class hierarchy
405reference</a> will only ever refer to a
406single function.</p>
407<p><strong>Return Types:</strong></p>
408<p>The case of return types is handled along the same lines as parameter
409types, subject of course to the restriction that C++ functions cannot
410be overloaded by return type. Thus, an interface such as</p>
411<pre class="literal-block">
412<em>compatible-smart-ptr</em>&lt;T&gt; container::release( );
413</pre>
414<p>means that precisely one of <tt class="docutils literal"><span class="pre">std::auto_ptr&lt;T&gt;</span></tt> or
415<tt class="docutils literal"><span class="pre">std::unique_ptr&lt;T&gt;</span></tt> is used as the return type. If the compiler
416provides <tt class="docutils literal"><span class="pre">std::auto_ptr&lt;T&gt;</span></tt>, then</p>
417<pre class="literal-block">
418std::auto_ptr&lt;T&gt; container::release( );
419</pre>
420<p>is present, even if the compiler provides <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>. For
421compilers that only provide <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>, the interface above
422becomes</p>
423<pre class="literal-block">
424std::unique_ptr&lt;T&gt; container::release( );
425</pre>
426<p>In practice, this means that for users of C++98/03/11/14, such return
427types are always <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt>; for users of C++17 and onwards the
428return type is <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>.</p>
429<p><strong>Details:</strong></p>
430<p>The ISO C++11 standard saw the addition of the smart pointer class template
431<tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>, and with it the formal deprecation of
432<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt>. After spending C++11 and C++14 with deprecated
433status, <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> has been formally removed as of
434the ISO C++17 standard. As such, headers mentioning
435<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> may be unusable in standard library
436implementations which disable <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> when C++17 or later
437is used. Boost.Pointer Container predates the existence of
438<tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt>, and since Boost v. <tt class="docutils literal">1.34</tt> it has provided
439<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> overloads for its interfaces. To provide
440compatibility across a range of C++ standards, macros are used for
441compile-time overloading or replacement of <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> interfaces with
442<tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt> interfaces.</p>
443<p><a class="reference external" href="../../config/index.html">Boost.Config</a> defines the macro
444<tt class="docutils literal">BOOST_NO_CXX11_SMART_PTR</tt> for compilers where
445<tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt> is not available, and <tt class="docutils literal">BOOST_NO_AUTO_PTR</tt> for
446compilers where <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> is removed (or is defective). These
447macros are used for compile-time selection of interfaces depending on
448parameter and return type. For interfaces that take smart pointer
449parameters, Boost.Pointer Container uses <tt class="docutils literal">BOOST_NO_AUTO_PTR</tt> and
450<tt class="docutils literal">BOOST_NO_CXX11_SMART_PTR</tt> independently of each other to provide
451interfaces taking one or both of <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt>,
452<tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt> as parameters. For interfaces with smart pointer
453return types, the Boost.Config macros are used first to check if
454<tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt> is available, providing <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt> as the
455return type only for compilers that provide <tt class="docutils literal"><span class="pre">std::unique_ptr</span></tt> but
456not <tt class="docutils literal"><span class="pre">std::auto_ptr</span></tt>.</p>
457<p>Thus, all mentions of</p>
458<pre class="literal-block">
459<em>compatible-smart-ptr</em>&lt;T&gt;
460</pre>
461<p>shall be understood to mean that <a class="reference external" href="../../config/index.html">Boost.Config</a> has been used as outlined above to provide
462a smart pointer interface that is compatible with compiler settings.</p>
463<p><strong>Navigate</strong></p>
464<ul class="simple">
465<li><a class="reference external" href="ptr_container.html">home</a></li>
466<li><a class="reference external" href="reference.html">reference</a></li>
467</ul>
468<hr><table class="docutils field-list" frame="void" rules="none">
469<col class="field-name" />
470<col class="field-body" />
471<tbody valign="top">
472<tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Thorsten Ottosen 2004-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see <a class="reference external" href="http://www.boost.org/LICENSE_1_0.txt">LICENSE_1_0.txt</a>).</td>
473</tr>
474</tbody>
475</table>
476</div>
477</body>
478</html>
479