C++14まで、関数に対してインライン化の指定ができましたが、C++1zでは変数にもインライン指定ができるようになります。
変数に対してインライン指定をすると、翻訳単位を跨いでひとつのオブジェクトになります。これによって、ヘッダファイルで変数を定義できるようになります。
// foo.h #ifndef FOO_HEADER #define FOO_HEADER struct Foo {}; struct X { // クラス定義の外でfooを定義する必要がない static inline Foo foo; }; // これまでは、ヘッダファイルで以下のように変数を宣言し、 // foo.h // struct X { // static Foo foo; // }; // // ソースファイルで変数を定義する必要があった // foo.cpp // Foo X::foo; #endif
// foo.h #ifndef FOO_HEADER #define FOO_HEADER struct Foo {}; // グローバル変数の定義をヘッダに書ける。 // 複数の翻訳単位を跨いでひとつのオブジェクトになる inline Foo theFooObject; #endif
なお、constexpr
静的メンバ変数は自動的にインラインになりますので、明示的にinline
を指定する必要はありません。
参照
修正履歴
- 2016/11/12 21:55 コメント欄での指摘を受け、「
constexpr
変数は自動的にインラインになる」としていた文章を、「constexpr
静的メンバ変数は自動的にインラインになる」と修正。
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。