2011-12-14 39 views
51

用戶被允許明確的專業化添加到std命名空間。但是,我明確禁止一些模板專門化。什麼可以和我不能專注於標準命名空間?

,不能我擅長什麼模板?

+1

什麼,你到底在尋找答案?真的,如果你想要專門化一些東西,你必須參考規範。大多數標準庫組件對專業化都有要求。對於Stack Overflow答案來說,你可以並且不能專門化的完整答案以及對專業化的限制是太長了。 – 2011-12-15 00:06:21

+0

通過「專業功能」,我假設你的意思是「專門功能模板」?順便說一下,C++ 11是否允許部分功能模板專門化? – fredoverflow 2011-12-15 07:42:27

回答

53

從標準引用鬆散:

  • numeric_limits不應專門用於非算術標準類型(例如complex<T>

  • 「[S]的shared_ptr pecializations應複製構造,CopyAssignable,和LessThanComparable [和]可轉換爲bool。「

  • 「的weak_ptr專業化應是可複製構造和CopyAssignable。」

  • 「[T] emplate專業化[中std::hash]應符合類模板哈希的要求。」

  • <type_traits>中的任何內容:「除非另有說明,否則爲本子節中定義的任何類模板添加專業化的程序的行爲是未定義的。 (僅明確允許common_type的一些專業化)

  • 區域設置有一定需要專業化。

  • istreambuf_iterator的所有特化應該有一個簡單的複製構造函數,一個constexpr默認構造函數和一個簡單的析構函數。

  • 「實例化類模板complex對於float,double或long double以外的任何類型的影響未指定。」我認爲這意味着定義這樣的其他專業化是毫無意義的。

  • atomic模板的專業化和實例化應該有一個刪除的拷貝構造函數,一個刪除的拷貝賦值操作符和一個constexpr值構造函數。」

  • 「不建議使用類模板unary_functionbinary_function。程序不應聲明這些模板的特化。」

當然總體條款17.6.4.2.1,句子1(感謝@sehe和@curiousguy)的和:

如果其添加聲明或定義一個C++程序的行爲是未定義除非另有指定,否則命名空間std或命名空間std中的 命名空間。程序可以添加一個模板專業化 任何標準庫模板,空間std只有在聲明依賴於用戶定義類型 和專業化符合原始模板的標準庫的要求,並沒有明確禁止 。

和句子2:

一個C的,如果它聲明

  • 標準庫模板類的成員函數的明確分工++程序是未定義行爲,或

  • 標準庫類或類模板的任何成員函數模板的顯式特化,或

  • 標準庫類或類模板的任何成員類模板的顯式或部分特化。

程序可以顯式實例在標準庫中定義的模板,只有在聲明 依賴於用戶定義類型的名稱和實例化符合原始模板的標準庫要求 。

相關問題