我一直在寻找一种可以交换两个项目的设施,并且有很强的异常(exception)保证。那是;使交换完全进行,或在遇到异常时将目标留在初始状态。当前标准中是否包含允许执行此操作的任何内容,尽管看起来很容易编写,但我仍然找不到任何内容。
我下面提供的是我拼凑起来的版本,可以尝试我想要的东西,但这并不是异常(exception),这超出了我对“强大”保证的要求。看来“强力保证”是无法测试的,但是noexcept保证可以。
#include <iostream>
#include <type_traits>
// Guarantee to exchange l and r fully
// or (not compile) leave them in the initial state
template<typename T>
void strong_exchange(T & l, T &r) noexcept
{
using std::swap;
static_assert( noexcept( swap(l, r) ), "Types must be noexcept swappable");
swap(l, r);
}
struct X
{
X()
{
throw "fish";
}
X(X &&) = delete;
};
int main(void)
{
int a, b;
strong_exchange(a, b);
X i, j;
strong_exchange(i, j);
}
最佳答案
可能是不可能的:
如果复制分配不是noexcept
(或执行复制的其他方式),则是不可能的。如果是noexcept
,std::swap()
应该可以做。否则,可能无能为力。
关于c++ - 是否有能力保证有力的C++交换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42088173/