c++ - 사용법 - thread_local 정적 멤버 템플릿 정의:gcc로 초기화 실패



thread function (1)

다시 한 번 질문을 마무리하기 위해 : 버그 보고서를 제출했습니다. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880 참조 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880

C ++ 클래스의 정적 멤버가 thread_local 및 멤버 템플릿 인 경우 초기화되지 않습니다.

#include <unordered_map>
#include <iostream>

class A {
public:
  template<typename T>
  thread_local static std::unordered_map<int,T> m;
};

template<typename T>
thread_local std::unordered_map<int,T> A::m{};

int main() {
  // A::m<int> = std::unordered_map<int,int>{}; // solves the problem
  std::cout << A::m<int>.bucket_count() << std::endl; // returns zero.
  A::m<int>.insert({1,2}); // causes SIGPFE (hash modulo bucket_count)
}

unordered_map은 초기화되지 않았으며 버켓 수는 0입니다. 이렇게하면 해시가 버킷 수를 모듈로 취할 때 0으로 나뉩니다. thread_local 없거나 template 이 없으면 정상적으로 작동합니다. 멤버를 그것을 사용하는 모든 쓰레드에서 수동으로 초기화 (주석 처리 된 라인)하면 문제가 해결됩니다.

이것은 C ++ 표준에 따라 정의되지 않은 동작입니까 아니면 컴파일러 버그 일 수 있습니까? 나는 gcc 7.1.1과 5.2.0을 사용하여 오류를 생성했다. clang 3.8이 작동하는 것 같습니다.

편집 : 나는 SVN에서 gcc 8.0.0 20170817이 동작을 확인하고 버그 보고서를 제출 : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880





c++14