相关但比C++11 static assert for equality comparable type?神秘的多-

JF Bastien的论文N4130 "Pad Thy Atomics!"让我想到,如果我们要使用atomic<T>::compare_exchange_weak(),而T是一个类或结构类型,例如

struct Count {
    int strong_count;
    int weak_count;
};

那么我们真的想静态声明两件事:

首先,T实际上是无锁原子的:
template<class T>
static constexpr bool is_lockfree_atomic_v =
    std::atomic<T>::is_always_lock_free;

其次,那个compare_exchange_weak将完成我们想要的。回忆(或从N4130回来)compare_exchange_weak是根据memcmpmemcpy定义的。因此,就T而言,我们需要检查这些功能是否可以正确执行:
template<class T>
static constexpr bool is_cmpxchgable_v =
    std::is_trivially_copyable_v<T> &&
    is_trivially_equality_comparable_v<T>;
is_trivially_copyable_v由STL提供。但是我们还没有is_trivially_equality_comparable_v,可悲的是,我的理解是P0515 Consistent Comparison不建议提供一个。 (P0515是使编译器能够检测到相等运算符从字面上看是“琐碎的”的功能,它不是用户提供的,并且在这样的条件下明确地默认为默认值。但是,它不引入任何限制。新概念,例如将“普通可比性”引入核心语言。)

我在“可比的”特征上的最佳表现是这样的:
template<class T, class U>
static constexpr bool is_equality_comparable_with_v =
    requires(std::declval<T>() == std::declval<U>());

template<class T>
static constexpr bool is_equality_comparable_v =
    is_equality_comparable_with_v<T, U>;

template<class T>
static constexpr bool is_trivially_equality_comparable_v =
    is_equality_comparable_v<T> &&
    std::has_unique_object_representations_v<T>;

但是,当std:: has_unique_object_representations_v不是标量类型时,此定义依赖operator== [[EDIT:具有未定义的行为,且其值与T的行为无关]]。而且我强烈怀疑实际上has_unique_object_representations_v将为诸如我的原始Count类型的结构类型返回垃圾。
struct Yes { int a; int b; };
struct No { short a; int b; };
using Yes2 = std::tuple<int, int>;
struct No2 { int a; int b; bool operator==(const No2&) { return true; }};
  • Clang / libc++尚未实现has_unique_object_representations
  • MSVC尚未实现has_unique_object_representations,AFAIK。
  • 表示has_unique_object_representations_v<Yes>,甚至正确地报告了该not has_unique_object_representations_v<No>,但是错误地报告了该not has_unique_object_representations_v<Yes2>和该has_unique_object_representations_v<No2>


  • 所以我的问题是:(1)有没有更好的方法来测试“琐碎的可比性”? (2)如果P0515成为C++ 20的标准,那么对is_trivially_equality_comparable(和is_trivially_less_than_comparable等)的建议方向是否有任何变化? (3)应该有吗?

    最佳答案

    我认为您想要has_padding_bits。 p0528详细解释了原因。简而言之,您完全正确使用memcpymemcmp!

    在 jackson 维尔 session 之前,将有一篇更新的论文。

    2018年中更新

    标准委员会决定朝着p0528的另一个方向发展,而是使具有填充位Just Type的cmpxchg类型。 p0528要解决的问题将没有has_padding_bits

    目前,您的问题没有好的答案:-)

    09-25 18:47