Inline и extern, похожи ли эти примеры? - PullRequest
1 голос
/ 25 марта 2020

Пример 1: использование inline для объявления и определения не const static переменных-членов в теле class.

Будут ли эти два примера одинаковыми / будут иметь одинаковый результат для нескольких единицы перевода?

#include <iostream>
#include <vector>

struct A1 {
    static int counter;
    // The vector's here to try something with a default constructor
    static std::vector<int> vec;

    A1() {
        ++counter;
        vec.push_back(counter);
    }

    ~A1() {
        --counter;
        vec.push_back(counter);
    }
};

int A1::counter = 0;
std::vector<int> A1::vec;

// Will this work as intended across multiple files?
// This one looks more elegant, I don't need to define them outside the class
struct A2 {
    inline static int counter = 0;
    inline static std::vector<int> vec;

    A2() {
        ++counter;
        vec.push_back(counter);
    }

    ~A2() {
        --counter;
        vec.push_back(counter);
    }
};

int
main() {

    A1 a11;
    A1 a12;
    std::cout << A1::counter << '\n';
    std::cout << A1::vec.back() << '\n';

    A2 a21;
    A2 a22;
    std::cout << A2::counter << '\n';
    std::cout << A2::vec.back() << '\n';

    return 0;
}

Пример 2: использование inline вместо extern для объявления и определения не constexpr const thread_local global.

Опять будет эти два примера выполняют одинаковые / имеют одинаковый результат для нескольких единиц перевода?

Первый вариант:

// A.hpp
auto
get_thread_seed() {
    // Just a silly example
    int * value = new int();
    auto const seed = reinterpret_cast<uintptr_t>(value);
    delete value;
    return seed;
}

extern thread_local auto const thread_seed;

// A.cpp
#include <A.hpp>

extern thread_local auto const thread_seed = get_thread_seed();

Второй вариант:

// A.hpp
auto
get_thread_seed() {
    // Just a silly example
    int * value = new int();
    auto const seed = reinterpret_cast<uintptr_t>(value);
    delete value;
    return seed;
}

inline thread_local auto const thread_seed = get_thread_seed();

Будет ли все это работать так же с точки зрения ODR использования?

...