Что-то, чтобы получить ваш ум кипения:
template <typename T>
struct Question
{
int& GetCounter() { static int M; return M; }
};
И в этом случае, сколько счетчики?
.
.
.
.
Ответ: так много различных T
, для которых Question
конкретизируется с, то есть template
не сам класс, но Question<int>
класс, отличный от Question<double>
, поэтому каждый из них имеет другой счетчик.
В основном, как было сказано, локальный статический элемент является правильным для функции/метода. Существует один метод, и два разных метода будут иметь два разных локальных статических (если они вообще есть).
struct Other
{
int& Foo() { static int M; return M; }
int& Bar() { static int M; return M; }
};
Здесь есть 2 счетчика (всего): один Other::Foo()::M
и другой Other::Bar()::M
(имена только для удобства).
Тот факт, что существует класс аксессуар:
namespace Wazza
{
int& Foo() { static int M; return M; }
int& Bar() { static int M; return M; }
}
Два других счетчиков: Wazza::Foo()::M
и Wazza::Bar()::M
.
Очевидная заметка: статическая переменная предназначена для всех целей и целей, глобальная переменная со всеми бедами, которые она несет, среди которых: нет возможного повторного входа (тестирование сложнее), обязательства сериализации доступа в многопоточном коде (узкое место производительности), ... По возможности старайтесь не использовать глобальные переменные (и, следовательно, синглтоны). –