GCC 與非命名空間範圍內的顯式專業化標準不一致
C 標準明確允許在任何範圍內聲明顯式模板專業化可以在其中定義相應的主模板。然而,GCC 的行為卻偏離了這個標準。在最新版本的 GCC 中觀察到了這種差異,在命名空間之外聲明的明確專業化無法編譯。
為了說明該問題,請考慮以下程式碼:
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
雖然此程式碼在Clang 中編譯成功,但在GCC 中遇到錯誤:
error: explicit specialization in non-namespace scope 'struct Widget<T>'
此錯誤與C 標準不一致,C 標準明確允許在非命名空間範圍內明確專業化。根據C 標準中的[temp.expl.spec] 第2 段:
「可以在定義相應主模板的任何範圍內聲明顯式特化。」
這種與標準的偏差構成了GCC 中的潛在錯誤。若要回報此問題,請按照以下步驟操作:
透過報告此問題,您可以做出貢獻改進GCC並確保其完全遵循C標準。
以上是為什麼 GCC 拒絕命名空間之外的顯式專業化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!