相关但比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
是根据memcmp
和memcpy
定义的。因此,就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; }};
has_unique_object_representations
。 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详细解释了原因。简而言之,您完全正确使用memcpy
和memcmp
!
在 jackson 维尔 session 之前,将有一篇更新的论文。
2018年中更新
标准委员会决定朝着p0528的另一个方向发展,而是使具有填充位Just Type的cmpxchg类型。 p0528要解决的问题将没有has_padding_bits
。
目前,您的问题没有好的答案:-)