c++ - 为什么要使用Concept&Constraint

标签 c++ c++20

我不太明白为什么 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);

发生编译错误

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

所以我很纳闷,他们都有CE,那我为什么要用constraints呢?

我想如果我想清理错误信息,我可以使用 SFINAE。

最佳答案

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

  1. 您会收到一条明确的错误消息。
  2. 在重载决议中不会考虑重载(是的,还有一种方法可以执行 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 技术有先见之明,才能理解为什么有人会写这样的东西。它非常专业友好。模板已经具有这种能力,但这是历史巧合。概念(精简版)和约束使我们能够以更自然的方式表达同一事物。

将以上与您的 OP 或此进行比较:

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

哪个选项表达得更清楚?不是旧技术,我会说。

关于c++ - 为什么要使用Concept&Constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49668120/

相关文章:

c++ - 使用 clang 将 std lib 作为模块导入

c++ - 1 最终编译器错误 :( can someone explain in real simple for me

android - cocos2d-X facebook 集成 c++

c++ - 如何让 gcc 使用 SSE4.1 pminuq/pminud/etc 操作码对代码进行矢量化?

c++ - forward_iterator 概念的冗余?

c++ - 即使使用 "Cannot form reference to void"也会出现 `requires(!std::is_void_v<T>)` 错误

c++ - 使用C++ 20 chrono,如何计算有关日期的各种事实

c++ - 如何从 C 中的 pe (exe) 文件中删除一些数据

c++ - 修复关于 C/C++ 和寄存器访问的知识差距

c++ - 在 C++20 中,如果宏是 #undef'd,然后又是 #define'd,那么它是否被认为是 "active"?