为什么std::same_as的实现方式如此奇怪?

6

cppref 提供了 std::same_as 的可能实现:

namespace detail {
    template<class T, class U>
    concept SameHelper = std::is_same_v<T, U>;
}

template<class T, class U>
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

为什么不直接按照以下方式实现:
template<class T, class U>
concept same_as = std::is_same_v<T, U> && std::is_same_v<U, T>;

甚至更短:

template<class T, class U>
concept same_as = std::is_same_v<T, U>;
1个回答

2

它处理的是概念中发生的包含

按照您的建议,

same_as<T,U>不包含same_as<U,T>

更多信息请参见cppreference


对于最后一个选项,但第一个选项不是等价的吗? - 463035818_is_not_a_number
std::is_same_v 不是概念(concept),因此 same_as<T, U> 将是一个原子约束,其表达式为 std::is_same_v<T, U> && std::is_same_v<U, T> - Jarod42
谢谢,我已经找到了这个链接来了解详情。它需要更多的时间去阅读,所以我把它放在我的列表上 :) - 463035818_is_not_a_number

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接