我正在一个有类的图书馆工作foo
。foo
有一个不平凡的构造函数。当我创建std::array
of foo
( std::array<foo, 10>
) 时,构造函数被调用 10 次。我想实现一种单独的方式来初始化foo
. 定义专业化是否会std::array<foo, N>
导致未定义的行为或任何其他问题?如果可以的话,我的专业需要具备哪些属性?
https://en.cppreference.com/w/cpp/language/extending_std表示允许自定义类型的专业化,除非明确禁止,并且https://en.cppreference.com/w/cpp/container/array没有说什么关于它。
use*_*522 10
是的,您可以专门std::array<foo, N>
针对程序定义的foo
. 然而,这有很多问题,这里只给出两个主要的问题:
的每个用户都std::array<foo, N>
必须在第一次使用实例化之前包含部分特化std::array<foo, N>
。否则行为是未定义的。因此,如果一个翻译单位或库std::array<foo, N>
在不包含专业化的情况下使用,就会遇到问题。即使从更实际的角度(而不是标准的 UB)来看,在这种情况下,库/翻译单元之间也可能存在 ABI 中断。换句话说,放置专业化的唯一安全位置是在库内提供的标头foo
中。
您的专业化必须满足该标准对std::array
. 这些要求之一是std::array
聚合类型。这意味着您无法为该类提供自定义构造函数,从而使您的目标变得不可能。
相反,定义您自己的容器类型,使其按照您想要的方式运行,尽管我质疑您到底在想什么。很可能您想要的东西很复杂,std::vector
并且它会更好地为您服务。有时,std::vector
分配最大大小的完全堆栈也很好,但标准库没有。但是,可以使用自定义堆栈分配器和std::vector
.