2013-12-12 3 views
6

Per quanto ne so, ogni funzione membro non statica definita all'interno di una classe è implicitamente in linea. Ora mi chiedo se lo stesso è valido per le funzioni membro statico, considerando che posso definire la funzione più volte in diverse unità di traduzione.Una funzione membro statica definita all'interno di una classe è implicitamente inserita?

Ad esempio:

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: In questo documento (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf) ho trovato questo linee:

9.4.1 funzioni membro statiche [class.static.mfct] 1 [Nota : Le regole descritte in 9.3 si applicano alle funzioni membro statiche. - nota end]

e precedentemente descritto al punto 9.3:

Una funzione membro può essere definita (8.4) nella sua definizione di classe, in qual caso è una funzione membro inline (7.1.2) [...]

+1

Sì, ma se sei preoccupato, lanciare la parola chiave 'inline' non danneggerà nulla. –

+3

La funzione sarà 'inline' che non significa che sarà * in linea * –

risposta

9

Sì.

Vorrei citare lo standard, ma l'hai già fatto.

considerando che posso definire la funzione più volte in unità di traduzione diverse.

Solo se si garantisce che il contenuto sarà lo stesso, rendendo questo un non-problema.

Accertarsi di non confondere "dichiarazione" e "definizione" — solo quando si fornisce il corpo della funzione proprio all'interno della definizione della classe, si applica ciò. Ciò rende anche la tua preoccupazione un non-problema.

// "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); 

Infine, essere consapevoli del fatto che queste funzioni saranno implicitamente contrassegnati inline, ma questo non è la stessa cosa di essere effettivamente in inline.

+0

+1. Nota che 'statico' o non statico, tutte le funzioni membro sono in linea se sono definite all'interno della classe stessa. – Nawaz