Следующий код должен создавать класс thread_local
только один раз, но в конечном итоге его инициализируют при каждом доступе
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
template <typename T>
class Something {
public:
struct TLBookkeeping {
TLBookkeeping() {
std::cout << "TLBookkeeping() " << std::this_thread::get_id() << std::endl;
}
};
static void foo();
static thread_local TLBookkeeping bookkeeping_;
};
template <typename T>
thread_local typename Something<T>::TLBookkeeping Something<T>::bookkeeping_;
template <typename T>
void Something<T>::foo() {
std::cout << &bookkeeping_ << std::endl;
std::cout << &bookkeeping_ << std::endl;
}
namespace {
struct Struct {};
}
int main() {
Something<Struct>::foo();
}
(https://wandbox.org/permlink/fgqCDHV0axKDRt89)
Интересно, ошибкапоказывает только, когда Struct
находится в анонимном пространстве имен.
Кто-нибудь знает, является ли это ошибкой лягушки (gcc исправляет ошибку - https://wandbox.org/permlink/hsxRj8OdYbt4Eeck) или некорректно использует thread_local
?последнее, как правильно использовать? Если первое, что именно ошибка? И это где-то задокументировано? Должны ли мы открыть отчет об ошибке?