C++何时可以扩展`std`命名空间?

gre*_*iod 5 c++ namespaces std c++11

SO上的一个帖子说扩展std是UB(好吧,除非你当然是标准作者).但不时,std幸福地延长.什么时候可以这样做?

eer*_*ika 7

可以在std命名空间中添加定义的唯一情况是对命名空间中已存在的模板进行特化,并显式实例化模板.但是,仅当它们依赖于用户定义的类型时.

[namespace.std](标准草案):

  1. 如果C++程序向命名空间std或命名空间std中的命名空间添加声明或定义,则它是未定义的,除非另有说明.只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间std.

  2. 如果声明,C++程序的行为是不确定的

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

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

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

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


作为明确设计为用户定义类型扩展的标准模板的示例:std::hashstd::iterator_traits.