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
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
gcc (HEAD) 8 ... bu durumdan da etkileniyor – Swift
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. –