inline
specifierGeneral topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
|
Theinline specifier, when used in a function'sdecl-specifier-seq, declares the function to be aninline function.
A function defined entirely inside aclass/struct/union definition, whether it's a member function or a non-memberfriend function, is implicitly an inline function unless it is attached to anamed module(since C++20).
A function declaredconstexpr orconsteval(since C++20) on its first declaration is implicitly an inline function. A deleted function is implicitly an inline function: its (deleted) definition can appear in more than one translation unit. | (since C++11) |
Theinline specifier, when used in adecl-specifier-seq of a variable with static storage duration (static class member or namespace-scope variable), declares the variable to be aninline variable. A static data member declaredconstexpr on its first declaration is implicitly an inline variable. | (since C++17) |
Contents |
An inline function or inline variable(since C++17) has the following properties:
In an inline function,
Inline const variables at namespace scope haveexternal linkage by default (unlike the non-inline non-volatile const-qualified variables). | (since C++17) |
The original intent of theinline keyword was to serve as an indicator to the optimizer thatinline substitution of a function is preferred over function call, that is, instead of executing the function call CPU instruction to transfer control to the function body, a copy of the function body is executed without generating the call. This avoids overhead created by the function call (passing the arguments and retrieving the result) but it may result in a larger executable as the code for the function has to be repeated multiple times.
Since inline substitution is unobservable in the standard semantics, compilers are free to use inline substitution for any function that's not markedinline, and are free to generate function calls to any function markedinline. Those optimization choices do not change the rules regarding multiple definitions and shared statics listed above.
Because the meaning of the keywordinline for functions came to mean "multiple definitions are permitted" rather than "inlining is preferred" since C++98, that meaning was extended to variables. | (since C++17) |
If an inline function or variable(since C++17) with external linkage is defined differently in different translation units, the program is ill-formed, no diagnostic required.
Theinline specifier cannot be used with a function or variable(since C++17) declaration at block scope (inside another function).
Theinline specifier cannot re-declare a function or variable(since C++17) that was already defined in the translation unit as non-inline.
The implicitly-generated member functions and any member function declared as defaulted on its first declaration are inline just like any other function defined inside a class definition.
If an inline function is declared in different translation units, the accumulated sets ofdefault arguments must be the same at the end of each translation unit.
In C, inline functions do not have to be declaredinline in every translation unit (at most one may be non-inline orexterninline), the function definitions do not have to be identical (but the behavior of the program is unspecified if it depends on which one is called), and the function-local statics are distinct between different definitions of the same function.
Seestatic data members for additional rules about inline static members. Inline variables eliminate the main obstacle to packaging C++ code as header-only libraries. | (since C++17) |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_inline_variables | 201606L | (C++17) | Inline variables |
Header "example.h":
#ifndef EXAMPLE_H#define EXAMPLE_H #include <atomic> // function included in multiple source files must be inlineinlineint sum(int a,int b){return a+ b;} // variable with external linkage included in multiple source files must be inlineinlinestd::atomic<int> counter(0); #endif
Source file #1:
#include "example.h" int a(){++counter;return sum(1,2);}
Source file #2:
#include "example.h" int b(){++counter;return sum(3,4);}
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
CWG 281 | C++98 | a friend function declaration could use the inline specifier even if the friended function is not an inline function | prohibit such uses |
CWG 317 | C++98 | a function could be declared inline even if it has a non-inline definition in the same translation unit before the declaration | the program is ill- formed in this case |
CWG 765 | C++98 | a type defined in an inline function might be different in different translation units | such types are the same in all translation units |
CWG 1823 | C++98 | string literals in all definitions of an inline function were shared across all translation units | the requirement is removed due to consistency and implementations |
CWG 2531 | C++17 | a static data member could be implicitly inline even if it was not declaredconstexpr on its first declaration | it is not implicitly inline in this case |
C documentation forinline |