namespace std
的专业化设置了限制。
如果未另有规定,C++程序的行为在向命名空间std或命名空间内部添加声明或定义时是未定义的。程序可以向命名空间std添加任何标准库模板的模板专业化,前提是声明依赖于用户定义类型,并且专业化满足原始模板的标准库要求,且没有被明确禁止。
我找不到标准中定义用户定义类型这一短语的地方。
我听说的一个选择是,不是std::is_fundamental
类型的类型是用户定义类型,在这种情况下,std::vector<int>
将是用户定义类型。
std::vector<int>
,而且std::vector<int>
也不依赖于用户定义的任何类型,因此std::vector<int>
不是用户定义类型。这个问题会影响到一个实际问题:“你能否将
std::tuple<Ts...>
的std::hash
专门化注入到namespace std
中?”能够这样做有些方便--另一种选择是创建另一个命名空间,在其中递归地构建我们对std::tuple
(以及可能在std
中没有hash
支持的其他类型)的哈希,只有当我们在那个命名空间中找不到哈希时,我们才会回退到std
。然而,如果这是合法的,那么当标准向
namespace std
添加std::tuple
的hash
专门化时,已经专门化了它的代码将会失效,从而产生不添加这样的专门化的理由。
虽然我在谈论以std::vector<int>
为具体例子,但我想问的是,std
中定义的类型是否曾经是用户定义类型。第二个问题是,即使不是,也许当用户使用std::tuple<int>
时,它会变成一个用户定义类型(这很棘手:如果std
中的某些东西定义了std::tuple<int>
,并且您为std::tuple<Ts...>
部分特化hash
,那会发生什么)。
目前此问题存在未解决的缺陷。
int
,char
等)之外的任何类型。但我同意在此引用中使用此术语有些奇怪。 - Konrad Rudolphstruct
/等构建的类型集合是一个“派生类型”,而短语“用户定义类型”在标准中并没有出现。 - Yakk - Adam Nevraumontstd::atomic<int>
呢?std::thread
呢? - Yakk - Adam Nevraumont