我一直在寻找一种可以交换两个项目的设施,并且有很强的异常(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(或执行复制的其他方式),则是不可能的。如果是noexceptstd::swap()应该可以做。否则,可能无能为力。

关于c++ - 是否有能力保证有力的C++交换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42088173/

10-13 07:55