什么能和不能专注于std命名空间?

时间:2011-12-14 23:54:42

标签: c++ c++11 std explicit-specialization

允许用户向std命名空间添加显式特化。但是,有一些模板我明确禁止专业化。

我可以和不可以使用哪些模板?

1 个答案:

答案 0 :(得分:57)

松散地引用标准:

  • numeric_limits不适用于非算术标准类型(例如complex<T>

  • shared_ptr的[S]专业化应为CopyConstructible,CopyAssignable和LessThanComparable [并]可转换为bool。”

  • weak_ptr的专精术应为CopyConstructible和CopyAssignable。”

  • “[T] emplate专业化[{1}}]应满足类模板散列的要求。”

  • std::hash中的任何内容:“除非另有说明,否则为本子条款中定义的任何类模板添加特殊化的程序的行为是未定义的。” (仅明确允许<type_traits>的某些特化)

  • 区域设置具有某些必需的专业化。

  • common_type的所有特化都应该有一个简单的复制构造函数,一个constexpr默认构造函数和一个简单的析构函数。

  • “未指定为float,double或long double以外的任何类型实例化类模板istreambuf_iterator的效果。”我认为这意味着定义其他专业化是没有意义的。

  • complex模板的特化和实例化应具有已删除的复制构造函数,已删除的复制赋值运算符和constexpr值构造函数。”

  • “不推荐使用类模板atomicunary_function。程序不得声明这些模板的专业化。”

当然还有总括性条款17.6.4.2.1,第1句(感谢@sehe和@curiousguy):

  

如果C ++程序向名称空间std或a添加声明或定义,则它的行为是未定义的   除非另有说明,否则命名空间std中的命程序可以添加模板专业化   对于任何标准库模板到命名空间std,仅当声明取决于用户定义的类型时   并且专业化符合原始模板的标准库要求,并未明确说明   禁止的。

句子2:

  

如果声明

,则C ++程序的行为是未定义的      
      
  • 标准库类模板的任何成员函数的显式特化,或

  •   
  • 标准库类或类模板的任何成员函数模板的显式特化,或

  •   
  • 标准库类或类模板的任何成员类模板的显式或部分特化。

  •   
     

只有声明时,程序才能显式实例化标准库中定义的模板   取决于用户定义类型的名称,实例化符合标准库要求   对于原始模板。