404. May a replacement allocation function be declared inline?

Section: 16.4.5.6 [replacement.functions], 17.6.3 [new.delete] Status: CD1 Submitter: Matt Austern Opened: 2003-04-24 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [replacement.functions].

View all issues with CD1 status.

Discussion:

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.

Three different parts of the standard mention requirements on replacement functions: 16.4.5.6 [replacement.functions], 17.6.3.2 [new.delete.single] and 17.6.3.3 [new.delete.array], and 6.7.5.4 [basic.stc.auto].

None of these three places say whether a replacement function may be declared inline. 17.6.3.2 [new.delete.single] paragraph 2 specifies a signature for the replacement function, but that's not enough: the inline specifier is not part of a function's signature. One might also reason from 9.2.3 [dcl.fct.spec] 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.

Proposed resolution:

Add a new sentence to the end of 16.4.5.6 [replacement.functions] paragraph 3: "The program's definitions shall not be specified as inline. No diagnostic is required."

[Kona: added "no diagnostic is required"]

Rationale:

The fact that inline 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.