2013-12-12 22 views
6

私が知る限り、クラス内で定義されたすべての非静的メンバー関数は暗黙的にインライン化されています。 これは、静的メンバー関数にも同じものが有効かどうか、関数を複数の異なる翻訳単位で複数定義できることを考えています。例として静的メンバー関数は暗黙的にインライン化されたクラス内で定義されていますか?

class Foo { 

public: 

    static void static_f(void) { std::cout << static_data << std::endl; } //Is it inline? 
    static void static_f2(void); //I guess it isn't 

private: 

    static int static_data; 
    int non_static_data; 
}; 

PS:

9.4.1静的メンバ関数[class.static.mfct] 1 [注:この文書(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf)で、私は、この行を発見:9.3で説明した規則は、静的メンバー関数に適用されます。 - エンドノート]

以前セクション9.3で:

メンバ関数が定義されてもよい

それは、インラインメンバ関数である場合 そのクラス定義における(8.4)、(7.1.2 )[...]

+1

はい、あなたが心配している場合は、 'inline'キーワードを投げても問題はありません。 –

+3

この関数は 'inline'になります。つまり、インライン* –

答えて

9

はい。

私は標準を引用しますが、すでに行っています。

私が異なる翻訳単位で複数の機能を定義できると考えると、

内容が同じであることが保証されている場合のみ、これは問題ではありません。

「宣言」と「定義」—は、クラス定義内に関数本体を指定した場合にのみ、これらのいずれも適用されません。それはまたあなたの心配を非問題にします。

// "Is it inline?"  YES. 
static void static_f(void) { std::cout << static_data << std::endl; } 

// "I guess it isn't" Nope. 
static void static_f2(void); 

最後に、これらの関数は、暗黙的にinlineにマークされることに注意して、これは実際にをインライン化されているものと同じものではありません。

+0

+1となるわけではありません。静的でも静的でなくても、すべてのメンバー関数はクラス内部で定義されていればインラインであることに注意してください。 – Nawaz

関連する問題