C++1z インライン変数

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の以下の階層の下に解説ページを用意する予定です。