Ricerca…


introduzione

Una variabile in linea può essere definita in più unità di traduzione senza violare la regola della definizione unica . Se è definito a più livelli, il linker unirà tutte le definizioni in un singolo oggetto nel programma finale.

Definizione di un membro dati statico nella definizione della classe

Un membro di dati statici della classe può essere completamente definito all'interno della definizione di classe se è dichiarato in inline . Ad esempio, la seguente classe può essere definita in un'intestazione. Prima di C ++ 17, sarebbe stato necessario fornire un file .cpp per contenere la definizione di Foo::num_instances modo che fosse definito solo una volta, ma in C ++ 17 le definizioni multiple della variabile inline Foo::num_instances riferiscono tutti allo stesso oggetto int .

// warning: not thread-safe...
class Foo {
  public:
    Foo() { ++num_instances; }
    ~Foo() { --num_instances; }
    inline static int num_instances = 0;
};

Come caso speciale, un membro dati statico di constexpr è implicitamente in linea.

class MyString {
  public:
    MyString() { /* ... */ }
    // ...
    static constexpr int max_size = INT_MAX / 2;
};
// in C++14, this definition was required in a single translation unit:
// constexpr int MyString::max_size;


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow