<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 404: May a replacement allocation function be declared inline?</title>
<meta property="og:title" content="Issue 404: May a replacement allocation function be declared inline?">
<meta property="og:description" content="C++ library issue. Status: CD1">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue404.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#CD1">CD1</a> status.</em></p>
<h3 id="404"><a href="lwg-defects.html#404">404</a>. May a replacement allocation function be declared inline?</h3>
<p><b>Section:</b> 16.4.5.6 <a href="https://wg21.link/replacement.functions">[replacement.functions]</a>, 17.6.3 <a href="https://wg21.link/new.delete">[new.delete]</a> <b>Status:</b> <a href="lwg-active.html#CD1">CD1</a>
 <b>Submitter:</b> Matt Austern <b>Opened:</b> 2003-04-24 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#replacement.functions">issues</a> in [replacement.functions].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#CD1">CD1</a> status.</p>
<p><b>Discussion:</b></p>
<p>
The eight basic dynamic memory allocation functions (single-object
and array versions of ::operator new and ::operator delete, in the
ordinary and nothrow forms) are replaceable.  A C++ program may
provide an alternative definition for any of them, which will be used
in preference to the implementation's definition.  
</p>

<p>
Three different parts of the standard mention requirements on
replacement functions: 16.4.5.6 <a href="https://wg21.link/replacement.functions">[replacement.functions]</a>, 17.6.3.2 <a href="https://wg21.link/new.delete.single">[new.delete.single]</a>
and 17.6.3.3 <a href="https://wg21.link/new.delete.array">[new.delete.array]</a>, and 6.8.6.4 <a href="https://wg21.link/basic.stc.auto">[basic.stc.auto]</a>.
</p>

<p>None of these three places say whether a replacement function may
  be declared inline.  17.6.3.2 <a href="https://wg21.link/new.delete.single">[new.delete.single]</a> paragraph 2 specifies a
  signature for the replacement function, but that's not enough:
  the <code>inline</code> specifier is not part of a function's signature.
  One might also reason from 9.2.3 <a href="https://wg21.link/dcl.fct.spec">[dcl.fct.spec]</a> paragraph 2, which
  requires that "an inline function shall be defined in every
  translation unit in which it is used," but this may not be quite
  specific enough either.  We should either explicitly allow or
  explicitly forbid inline replacement memory allocation
  functions.</p>


<p id="res-404"><b>Proposed resolution:</b></p>
<p>
Add a new sentence to the end of 16.4.5.6 <a href="https://wg21.link/replacement.functions">[replacement.functions]</a> paragraph 3:
"The program's definitions shall not be specified as <code>inline</code>.
No diagnostic is required."
</p>

<p><i>[Kona: added "no diagnostic is required"]</i></p>




<p><b>Rationale:</b></p>
<p>
The fact that <code>inline</code> isn't mentioned appears to have been
nothing more than an oversight.  Existing implementations do not
permit inline functions as replacement memory allocation functions.
Providing this functionality would be difficult in some cases, and is
believed to be of limited value.
</p>





</body>
</html>
