c – 关于约束和概念

我真的不明白为什么C 20会提供这样的功能.我认为这是多余的,是的,我确定我错了,但我需要有人指出我错的原因以及如何优雅地使用这个功能.
这是一个例子:
template<typename T>
concept LessCompareable=requires(const T& lhs,const T& rhs)
{
      {lhs<rhs}->bool;
};

现在我已经定义了一个概念.
然后我会像这样约束一个函数模板:
(好吧,我们把它命名为comp,实际上它就像std :: min)

template<typename T>
const T& comp(const T& a,const T& b) requires LessCompareable<T>
{return a<b?a:b;}

所以问题是如果你这样称呼它

std::thread a,b;
cout<<comp(a,b);

complie错误发生

但如果我们不使用约束,CE也会发生.

所以这让我感到困惑,他们都有CE,那为什么我应该使用约束呢?

解决方法

约束的目的是允许您使用内置语言结构指定操作的前提条件.这些前置条件可以由编译器检查,并且:

>您将收到明确的错误消息.
>过载分辨率不会考虑过载(是的,还有一种方法可以做SFINAE).

错误信息很好,但是#2的新前置条件检查才是真正的结果.在C 20获得相同效果之前你需要做的是这样的:

template<typename T,std::enable_if_t<has_less_than_op<T>::value,int> = 0>
const T& comp(const T& a,const T& b) 
{return a<b?a:b;}

它很笨重,而且你需要对SFINAE技术有所了解才能理解为什么会有人写这样的东西.它非常友好.模板已经拥有了这种力量,但这是一个历史巧合.概念(lite)和约束使得能够以更自然的方式表达相同的事物.

将上述内容与您的OP或此进行比较:

template<LessCompareable T>
const T& comp(const T& a,const T& b)
{return a<b?a:b;}

哪种替代方案表达的东西更清晰?我会说,这不是旧技术.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...