填充含非抛出拷贝赋值/默认构造对象的vector时,std::fill会抛异常吗?
问题解答
我们可以确保resetVector函数永远不会抛出异常,原因如下:
- 临时对象构造无异常:代码中
T{}是默认构造临时对象,已经通过static_assert(std::is_nothrow_default_constructible_v<T>)确保了T的默认构造不会抛出异常,这一步不会出现异常风险。 - std::fill非执行策略版本的行为:不带执行策略的
std::fill核心逻辑是遍历迭代器范围,将每个元素拷贝赋值为传入的临时对象。根据C++标准,这个版本的std::fill本身不会抛出额外异常,唯一可能的异常来源是元素的拷贝赋值操作——但我们已经通过static_assert(std::is_nothrow_copy_assignable_v<T>)保证了T的拷贝赋值不会抛出异常。 - 容器无额外风险操作:整个过程只是修改
std::vector已有的元素值,不会触发容器的内存分配、扩容或其他可能抛出异常的操作,容器大小未发生变化,迭代器遍历也不会产生异常。
综上,在满足static_assert的前提下,这个函数绝对不会抛出异常。
内容的提问来源于stack exchange,提问作者mentalmushroom
相关产品推荐
相关产品推荐

