0

问题std::array在于它具有固定的编译时大小。我想要一个可以使用动态大小创建的容器,但该大小在容器的整个生命周期内保持固定(因此std::vector不起作用,因为push_back会将大小增加 1)。

我想知道如何实现这一点。我尝试编写一个包含内部std::vector存储的类,并且只公开std::vector不改变大小的成员。我的问题是关于复制/移动赋值运算符以及swap成员函数。通常,移动赋值声明为noexcept. 但是,在分配之前,我必须检查 thelhs和 therhs的大小是否相同。如果不是,我必须抛出一个异常,因为否则,分配rhslhs会改变 的大小lhs,这是我不想要的。也是swap如此,在我的实现中也是noexcept出于同样的原因。

我知道我违背了通常的建议来制作swap和移动作业noexcept(Scott Meyers 的 Modern Effective C++ 的第 14 项),所以我想知道这是否是好的设计?还是有更好的方法来实现固定运行时大小的容器?

示例:假设我已经使用名称定义了我的固定大小容器FixedSizeArray<T>

auto arr1 = FixedSizeArray<double>(4, 1.0)

最后一行代码定义了一个FixedSizeArray包含大小为 4 的双精度数。现在定义另一个:

auto arr2 = FixedSizeArray<double>(10, 1.0)

应为以下行:

arr1 = std::move(arr2)

扔?关于什么:

arr1.swap(arr2)
4

1 回答 1

1

一定要声明移动赋值和swapas noexcept。但是不要扔大小不匹配的东西...

由于您的数组是固定大小的,因此在任何情况下都无法分配或交换两个不同大小的数组。这不是特殊情况,而是程序不知道自己在做什么的情况。这是一个assertion的情况。

于 2015-08-16T22:05:44.263 回答