Поиск…


Вступление

Встроенная переменная разрешается определять в нескольких единицах перевода без нарушения правила Единого определения . Если он многократно определен, компоновщик объединит все определения в один объект в конечной программе.

Определение статического члена данных в определении класса

Статический член данных класса может быть полностью определен в определении класса, если он объявлен inline . Например, следующий класс может быть определен в заголовке. До C ++ 17 было бы необходимо предоставить файл .cpp для определения определения Foo::num_instances чтобы он определялся только один раз, но в C ++ 17 несколько определений встроенной переменной Foo::num_instances все относятся к одному и тому же объекту int .

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

В качестве особого случая constexpr статических данных constexpr неявно встроен.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow