Пример 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
использования?