在std命名空间中添加模板特化

Moh*_*ain 5 c++ stl language-lawyer

背景:
我试图回答这个问题为什么我的重载<运算符不能用于STL排序.我的一个建议(除了使用谓词)是在命名空间std中移动自定义operator <,std::string以便编译器可以优先于模板化版本.

以惊人的速度回答了一个高度知名的用户的评论:

这是未定义的行为,不允许向namespace std添加声明,因为它可以更改标准库componens的行为

我的问题:
是否可以为stl类型添加模板特化,即使此特化的声明不包含用户定义的数据类型?


ps我删除了我的答案,因为我担心这可能是错的

Rei*_*ica 12

C++ 11,[namespace.std]§1:

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

上面的段落明确禁止不依赖于用户定义类型的特化.

至于动机:你不会添加模板专业化,而是单独的声明,这也是禁止的.

  • @MohitJain:是的,它仍然是错误的:你只能将它专门用于用户定义的类型,而不是库定义的类型或内置类型. (3认同)

MSa*_*ers 5

Angew得到了相关的引用,但解释是有缺陷的.

您建议添加模板专业化namespace std.当它取决于用户定义的类型时才允许这样做.你特别提到它没有.因此,不满足异常的前提条件,并且适用基本规则(无添加).不好.