definición de plantilla de miembro estático local de hilo: la inicialización falla con gcc


Cuando un miembro estático en una clase C++ es a la vez thread_local y una plantilla de miembro, no se inicializa.

#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)
}

El unordered_map no se inicializa y tiene una cuenta de cubo de cero. Esto conduce a una división cero cuando el hash se toma modulo el conteo de cubos. Sin el thread_local o sin el template funciona bien. Inicializar el miembro manualmente en cada hilo que lo usa (línea comentada) resuelve el problema.

¿Es este comportamiento indefinido de acuerdo con el estándar C++ ¿o podría ser un error del compilador? Probé con gcc 7.1.1 y con 5.2.0 que ambos producen el error. clang 3.8 parece funcionar.

Editar: Confirmé este comportamiento con gcc 8.0.0 20170817 de SVN y envié un informe de error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880

Author: maiphi, 2017-08-16

1 answers

Una vez más, para cerrar la pregunta: He enviado un informe de error, ver https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880

 3
Author: maiphi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-17 13:19:37