2017-08-16 10 views
28

C++クラスの静的メンバーがthread_localとメンバーテンプレートの両方である場合、初期化されません。thread_local静的メンバーテンプレートの定義:gccで初期化が失敗する

#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は初期化されておらず、バケットカウントはゼロです。これは、ハッシュがモジュロバケットカウントとされるとき、ゼロ除算につながります。 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

+3

はのように思える見ます私にはっきりとしたバグ。あなたは報告書を提出しましたか?あなたがした場合は、リンクを共有していただけますか? – SergeyA

+0

gcc(HEAD)8 ...これも影響を受けます – Swift

+1

私はそれがバグだとは思わない。あなたが作成したすべてのスレッドのデータを使用しない場合でも、そのデータを初期化するのに時間が掛からないのはなぜですか?スレッドローカルストレージは、コンパイラではなくOSによって処理されます。 –

答えて

関連する問題