我正在一个有课程的图书馆工作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/language/extending_std表示允许自定义类型的专业化,除非明确禁止并且https://en.cppreference.com/w/cpp/container/array https://en.cppreference.com/w/cpp/container/array没有提及任何相关内容。
是的,你可以专攻std::array<foo, N>
对于程序定义的foo
。然而,这有很多问题,这里只给出两个主要的问题:
-
每个用户的std::array<foo, N>
必须在第一次使用实例化之前包含部分专业化std::array<foo, N>
。否则行为是未定义的。因此,如果一个翻译单位或图书馆使用std::array<foo, N>
如果不包括专业化,你就会遇到问题。即使从更实际的角度(而不是标准的 UB)来看,在这种情况下,库/翻译单元之间也可能存在 ABI 中断。换句话说,放置专业化的唯一安全位置是在提供的标头中foo
, 这将inside图书馆。
-
您的专业化必须满足该标准对标准库实现的要求std::array
。这些要求之一是std::array
是一个聚合类型。这意味着您无法为该类提供自定义构造函数,从而使您的目标变得不可能。
相反,定义您自己的容器类型,使其按照您想要的方式运行,尽管我质疑您到底在想什么。您想要的可能很复杂std::vector
并且你会因此得到更好的服务。有时一个std::vector
分配最大大小的完全堆栈也很好,但标准库没有。但是,可以使用自定义堆栈分配器来模拟它std::vector
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)