c++ - 创建一个类模板 std::is_swappable

标签 c++ c++17

我正在尝试使类模板可交换。我不明白为什么静态断言会失败:

#include <type_traits>

template <class T>
struct A {};

template <class T, class U>
constexpr void
swap (A <T>&, A <U>&) {}

static_assert (std::is_swappable_v <A <int>>);

int main (){}

它通过

template <class T>
constexpr void
swap (A<T>&, A<T>&) {}

但是第一个不应该也可以吗?

神箭:https://godbolt.org/z/vbWWxrec4

最佳答案

std::is_swappable (和 std::is_swappable_with)也考虑了 std::swap

... are both well-formed in unevaluated context after using std::swap;

那么对于第一种情况,swap 的调用在用户定义的swapstd::swap 之间是不明确的.对于第二个,用户定义的 swap 在重载决议中获胜,然后 std::is_swappable 按预期工作。

关于c++ - 创建一个类模板 std::is_swappable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68844718/

相关文章:

c++ - 基于范围的 for 循环表达式中的临时可选

c++ - 在绕过 stdafx.h 依赖项的同时在项目之间共享类

c++ - 由于引用计数器原子递增/递减,shared_ptrs 是否会遇到缓存未命中?

c++ - opencv中的这个语句是什么意思?

c++ - 具有折叠表达式的函数的乘积

c++ - unordered_map 结构化绑定(bind)中的推导类型

c++ - 测量算法的每字节周期

c++ - 显式实例化模板类的显式实例化模板方法

c++ - 从函数返回数组时是否需要删除

c++ - `auto` 和 `std::any` 有什么区别?