Imported Upstream version 1.57.0
[platform/upstream/boost.git] / libs / smart_ptr / make_shared.html
index e47fe2a..76a2ad8 100644 (file)
@@ -1,37 +1,38 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
-       <head>
-               <title>make_shared and allocate_shared</title>
-               <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-       </head>
-       <body text="#000000" bgColor="#ffffff">
-               <h1><A href="../../index.htm"><IMG height="86" alt="boost.png (6897 bytes)" src="../../boost.png" width="277" align="middle"
-                                       border="0"></A>make_shared and allocate_shared function templates</h1>
-               <p><A href="#Introduction">Introduction</A><br>
-                       <A href="#Synopsis">Synopsis</A><br>
-                       <A href="#functions">Free Functions</A><br>
-                       <A href="#example">Example</A><br>
-               <h2><a name="Introduction">Introduction</a></h2>
-               <p>Consistent use of <a href="shared_ptr.htm"><code>shared_ptr</code></a>
-                       can eliminate the need to use an explicit <code>delete</code>,
-                       but alone it provides no support in avoiding explicit <code>new</code>.
-                       There have been repeated requests from users for a factory function that creates
-                       an object of a given type and returns a <code>shared_ptr</code> to it.
-                       Besides convenience and style, such a function is also exception safe and
-                       considerably faster because it can use a single allocation for both the object
-                       and its corresponding control block, eliminating a significant portion of
-                       <code>shared_ptr</code>'s construction overhead.
-                       This eliminates one of the major efficiency complaints about <code>shared_ptr</code>.
-               </p>
-               <p>The header file &lt;boost/make_shared.hpp&gt; provides a family of overloaded function templates,
-                       <code>make_shared</code> and <code>allocate_shared</code>, to address this need.
-                       <code>make_shared</code> uses the global operator <code>new</code> to allocate memory,
-                       whereas <code>allocate_shared</code> uses an user-supplied allocator, allowing finer control.</p>
-               <p>
-                       The rationale for choosing the name <code>make_shared</code> is that the expression
-                       <code>make_shared&lt;Widget&gt;()</code> can be read aloud and conveys the intended meaning.</p>
-               <h2><a name="Synopsis">Synopsis</a></h2>
-               <pre>namespace boost {
+    <head>
+        <title>make_shared and allocate_shared</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    </head>
+    <body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff">
+        <h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" 
+            width="277" align="middle" border="0">make_shared and allocate_shared 
+            function templates</h1>
+        <p><A href="#Introduction">Introduction</A><br>
+            <A href="#Synopsis">Synopsis</A><br>
+            <A href="#functions">Free Functions</A><br>
+            <A href="#example">Example</A><br>
+        <h2><a name="Introduction">Introduction</a></h2>
+        <p>Consistent use of <a href="shared_ptr.htm"><code>shared_ptr</code></a>
+            can eliminate the need to use an explicit <code>delete</code>,
+            but alone it provides no support in avoiding explicit <code>new</code>.
+            There have been repeated requests from users for a factory function that creates
+            an object of a given type and returns a <code>shared_ptr</code> to it.
+            Besides convenience and style, such a function is also exception safe and
+            considerably faster because it can use a single allocation for both the object
+            and its corresponding control block, eliminating a significant portion of
+            <code>shared_ptr</code>'s construction overhead.
+            This eliminates one of the major efficiency complaints about <code>shared_ptr</code>.
+        </p>
+        <p>The header file &lt;boost/make_shared.hpp&gt; provides a family of overloaded function templates,
+            <code>make_shared</code> and <code>allocate_shared</code>, to address this need.
+            <code>make_shared</code> uses the global operator <code>new</code> to allocate memory,
+            whereas <code>allocate_shared</code> uses an user-supplied allocator, allowing finer control.</p>
+        <p>
+            The rationale for choosing the name <code>make_shared</code> is that the expression
+            <code>make_shared&lt;Widget&gt;()</code> can be read aloud and conveys the intended meaning.</p>
+        <h2><a name="Synopsis">Synopsis</a></h2>
+        <pre>namespace boost {
 
   template&lt;typename T&gt; class shared_ptr;
 
@@ -41,7 +42,7 @@
   template&lt;typename T, typename A&gt;
     shared_ptr&lt;T&gt; <a href="#functions">allocate_shared</a>( A const &amp; );
 
-#if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )     // C++0x prototypes
+#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )    // C++0x prototypes
 
   template&lt;typename T, typename... Args&gt;
     shared_ptr&lt;T&gt; <a href="#functions">make_shared</a>( Args &amp;&amp; ... args );
 
 #endif
 }</pre>
-               <h2><a name="functions">Free Functions</a></h2>
-               <pre>template&lt;class T, class... Args&gt;
+        <h2><a name="functions">Free Functions</a></h2>
+        <pre>template&lt;class T, class... Args&gt;
     shared_ptr&lt;T&gt; make_shared( Args &amp;&amp; ... args );
 template&lt;class T, class A, class... Args&gt;
     shared_ptr&lt;T&gt; allocate_shared( A const &amp; a, Args &amp;&amp; ... args );</pre>
-               <blockquote>
-                       <p><b>Requires:</b> The expression <code>new( pv ) T( std::forward&lt;Args&gt;(args)... )</code>,
-                               where <code>pv</code> is a <code>void*</code> pointing to storage suitable
-                               to hold an object of type <code>T</code>,
-                               shall be well-formed.  <code>A</code> shall be an <em>Allocator</em>,
-                               as described in section 20.1.5 (<stong>Allocator requirements</strong>) of the C++ Standard.
-                               The copy constructor and destructor of <code>A</code> shall not throw.</p>
-                       <p><b>Effects:</b> Allocates memory suitable for an object of type <code>T</code>
-                               and constructs an object in it via the placement new expression <code>new( pv ) T()</code>
-                               or <code>new( pv ) T( std::forward&lt;Args&gt;(args)... )</code>.
-                               <code>allocate_shared</code> uses a copy of <code>a</code> to allocate memory.
-                               If an exception is thrown, has no effect.</p>
-                       <p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and owns the address
-                               of the newly constructed object of type <code>T</code>.</p>
-                       <p><b>Postconditions:</b> <code>get() != 0 &amp;&amp; use_count() == 1</code>.</p>
-                       <p><b>Throws:</b> <code>bad_alloc</code>, or an exception thrown from <code>A::allocate</code>
-                               or the constructor of <code>T</code>.</p>
-                       <p><b>Notes:</b> This implementation allocates the memory required for the
-                       returned <code>shared_ptr</code> and an object of type <code>T</code> in a single
-                       allocation. This provides efficiency equivalent to an intrusive smart pointer.</p>
-                       <p>The prototypes shown above are used if your compiler supports rvalue references
-                       and variadic templates.  They perfectly forward the <code>args</code> parameters to
-                       the constructors of <code>T</code>.</p>
-                       <p>Otherwise, the implementation will fall back on
-                       forwarding the arguments to the constructors of <code>T</code> as const references.
-                       If you need to pass a non-const reference to a constructor of <code>T</code>,
-                       you may do so by wrapping the parameter in a call to <code>boost::ref</code>.
-                       In addition, you will be
-                       limited to a maximum of 9 arguments (not counting the allocator argument of
-                       allocate_shared).</p>
-               </blockquote>
-               <h2><a name="example">Example</a></h2>
-               <pre>boost::shared_ptr&lt;std::string&gt; x = boost::make_shared&lt;std::string&gt;("hello, world!");
+        <blockquote>
+            <p><b>Requires:</b> The expression <code>new( pv ) T( std::forward&lt;Args&gt;(args)... )</code>,
+                where <code>pv</code> is a <code>void*</code> pointing to storage suitable
+                to hold an object of type <code>T</code>,
+                shall be well-formed.  <code>A</code> shall be an <em>Allocator</em>,
+                as described in section 20.1.5 (<strong>Allocator requirements</strong>) of the C++ Standard.
+                The copy constructor and destructor of <code>A</code> shall not throw.</p>
+            <p><b>Effects:</b> Allocates memory suitable for an object of type <code>T</code>
+                and constructs an object in it via the placement new expression <code>new( pv ) T()</code>
+                or <code>new( pv ) T( std::forward&lt;Args&gt;(args)... )</code>.
+                <code>allocate_shared</code> uses a copy of <code>a</code> to allocate memory.
+                If an exception is thrown, has no effect.</p>
+            <p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and owns the address
+                of the newly constructed object of type <code>T</code>.</p>
+            <p><b>Postconditions:</b> <code>get() != 0 &amp;&amp; use_count() == 1</code>.</p>
+            <p><b>Throws:</b> <code>bad_alloc</code>, or an exception thrown from <code>A::allocate</code>
+                or the constructor of <code>T</code>.</p>
+            <p><b>Notes:</b> This implementation allocates the memory required for the
+                returned <code>shared_ptr</code> and an object of type <code>T</code> in a single
+                allocation. This provides efficiency equivalent to an intrusive smart pointer.</p>
+            <p>The prototypes shown above are used if your compiler supports rvalue references
+                and variadic templates.  They perfectly forward the <code>args</code> parameters to
+                the constructors of <code>T</code>.</p>
+            <p>Otherwise, the implementation will fall back on
+                forwarding the arguments to the constructors of <code>T</code> as const references.
+                If you need to pass a non-const reference to a constructor of <code>T</code>,
+                you may do so by wrapping the parameter in a call to <code>boost::ref</code>.
+                In addition, you will be
+                limited to a maximum of 9 arguments (not counting the allocator argument of
+                allocate_shared).</p>
+        </blockquote>
+        <h2><a name="example">Example</a></h2>
+        <pre>boost::shared_ptr&lt;std::string&gt; x = boost::make_shared&lt;std::string&gt;("hello, world!");
 std::cout << *x;</pre>
-               <hr>
-               <p>
-                       $Date: 2008-05-19 15:42:39 -0400 (Mon, 19 May 2008) $</p>
-               <p><small>Copyright 2008 Peter Dimov. Copyright 2008 Frank Mori Hess.
-                               Distributed under the Boost Software License,
-                               Version 1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A>
-                               or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
-       </body>
+        <hr>
+        <p>$Date$</p>
+        <p><small>Copyright 2008 Peter Dimov. Copyright 2008 Frank Mori Hess.
+            Distributed under the Boost Software License,
+            Version 1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A>
+            or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
+    </body>
 </html>