什么可以和我不能专注于标准命名空间?
用户可以添加显式的特化到std
命名空间。 但是,我明确禁止从专业化的几个模板。
什么模板可以我不能专精?
从标准引用松散:
-
numeric_limits
不应该专门用于非算术标准types(例如complex<T>
) -
“
shared_ptr
专门化应该是CopyConstructible,CopyAssignable和LessThanComparable [和]可转换为bool
。” -
“
weak_ptr
专业化应该是CopyConstructible和CopyAssignable”。 -
“[stm
std::hash
]的模板特化符合类模板哈希的要求。” -
<type_traits>
任何内容:“除非另有说明,否则为本子节中定义的任何类模板添加特化的程序的行为是未定义的。 (只明确允许一些common_type
的特化) -
区域设置有一定的专业化。
-
istreambuf_iterator
所有istreambuf_iterator
应该有一个简单的复制构造函数,一个constexpr默认构造函数和一个简单的析构函数。 -
“实例化除了float,double或long double以外的任何types的类模板
complex
的效果未指定。 我认为这意味着定义这样的其他专业是毫无意义的。 -
“
atomic
模板的专门化和实例化应该有一个删除的拷贝构造函数,一个删除的拷贝赋值操作符和一个constexpr值构造函数。” -
“类模板
unary_function
和binary_function
被弃用,程序不应该声明这些模板的特化。”
当然,总体条款17.6.4.2.1,句子1(谢谢@sehe和@curiousguy):
除非另有说明,否则C ++程序的行为是未定义的,如果它将声明或定义添加到名称空间std或名称空间std中的名称空间。 只有当声明依赖于用户定义的types,并且专业化符合原始模板的标准库要求并且没有明确禁止时,程序可以将任何标准库模板的模板专用化添加到名称空间std。
和句子2:
C ++程序的行为是未定义的,如果它声明
标准库类模板的任何成员函数的显式特化,或者
标准库类或类模板的任何成员函数模板的显式特化,或
标准库类或类模板的任何成员类模板的显式或部分特化。
只有当声明取决于用户定义types的名称,并且实例化符合原始模板的标准库要求时,程序才可以显式实例化在标准库中定义的模板。