2017-08-16 68 views
28

C++ sınıfındaki statik bir üye hem thread_local hem de üye bir şablon olduğunda, başlangıç ​​durumuna getirilmez.thread_local statik üye şablon tanımı: gc ile başlatılamadı

#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 başlatılamıyor ve bir sıfır sayısı var. Bu karma, kova sayımı modulo alındığında sıfır bölüme yol açar. thread_local olmadan veya template olmadan çalışır. Üyeyi elle kullanan her iş parçacığına manuel olarak sıfırlama (yorumlanan satır) sorunu çözer.

Bu tanımlanmamış davranış C++ standardına göre mi yoksa bu bir derleyici hatası olabilir mi? Her ikisi de hata üretmek gcc 7.1.1 ve 5.2.0 ile çalıştı. clang 3.8 çalışıyor gibi görünüyor.

Düzenleme: SVN'den gcc 8.0.0 20170817 ile bu davranışı doğruladı ve bir hata raporu ibraz: soruyu kapatmak için, bir kez daha https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880

+3

gibi görünüyor bakın bir hata raporu ibraz bana açık bir böcek. Bir hata raporu gönderdin mi? Eğer yaptıysan, bağlantıyı paylaşır mısın? – SergeyA

+0

gcc (HEAD) 8 ... bu durumdan da etkileniyor – Swift

+1

Bunun bir hata olduğunu düşünmüyorum. Uygulamanız neden kullanmayacak olsa da, neden oluşturduğunuz her iş parçacığı için verileri başlangıçta harcadı? İş parçacığı yerel depolama, işletim sistemi tarafından değil, derleyici tarafından işlenir. –

cevap

İlgili konular