2013-12-12 25 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: В этом документе (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf) Я нашел эти строки:

9.4.1 статические функции [1] class.static.mfct [Примечание : Правила, описанные в 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

Смежные вопросы