在概念中表达对数据成员的概念要求的最佳方式是什么?

What's the best way to express concept requirements for data members in a concept?

定义具有嵌套概念要求的概念的最佳方法是什么类型的数据成员?沿着这些线的东西:

template<typename T>
concept MyConcept = requires(T a) {    
    {a.something} -> std::integral;
};

这不起作用,因为 a.something 被用作参考 (delctype((a.something)))。我想出的最好的作品是像这样强制右值的东西:

constexpr auto copy = [](auto value) { return value; };

template<typename T>
concept MyConcept = requires(T a) {    
    {copy(a.something)} -> std::integral;
};

我有更好的选择吗?

copy 的缺点是它可能会为您造成误报。引用成员将衰减为一个值。确保分析成员的实际类型的唯一方法是编写明确的嵌套要求。

template<typename T>
concept MyConcept = requires(T a) {    
    requires std::integral<decltype(a.something)>;
};

对于这种情况,创建一个专门用于引用积分的概念非常容易:

template<typename T>
concept integral_ref = std::is_reference_v<T> && std::integral<std::remove_reference_t<T>>;

然后您可以直接使用integral_ref

事实上,您甚至可以创建泛型 a reference_trait,它适用于任何期望对象类型的一元布尔类型特征:

template<typename T, template<typename> class Trait>
concept reference_trait = std::is_reference_v<T> && Trait<std::remove_reference_t<T>>::value;

template<typename T>
concept MyConcept = requires(T a) {    
    {a.something} -> reference_trait<std::is_integral>;
};