实现固定的运行时大小数组。应该移动ctor和swap抛出异常吗?

时间:2015-08-16 21:42:40

标签: c++11 stl containers move noexcept

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

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

我知道我反对通常建议swap并移动作业noexcept(Scott Meyers的第14项' Modern Effective C ++),所以我想知道这是不是很好的设计?或者是否有更好的方法来实现固定的运行时大小容器?

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

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

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

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

应该是以下几行:

arr1 = std::move(arr2)

扔?怎么样:

arr1.swap(arr2)

1 个答案:

答案 0 :(得分:1)

宣布移动分配和swapnoexcept。但是不要抛弃不匹配的尺寸......

由于您的阵列是固定大小的,因此在任何情况下最终都会分配或交换两个不同大小的数组无法正常工作。这不是一个例外情况,这是一个程序不知道它在做什么的情况。这是断言的案例