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

R. *_*des 56 c++ std explicit-specialization c++11

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

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

Ker*_* SB 58

从标准中松散地引用:

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

  • "[S] pecializations属于shared_ptrCopyConstructible,CopyAssignable和LessThanComparable [和]可转换为bool."

  • "专业化weak_ptr应为CopyConstructible和CopyAssignable."

  • "[T] emplate specializations [of 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++程序的行为是不确定的

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

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

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

仅当声明取决于用户定义类型的名称并且实例化符合原始模板的标准库要求时,程序才可以显式实例化标准库中定义的模板.

  • 如何在`std`名称空间中专门化`default_delete`呢? (3认同)
  • "程序可以将任何标准库模板的模板专门化添加到名称空间`std` only(...)专业化**满足原始模板的标准库要求**" (2认同)