我正在阅读这篇文章 blogpost关于 C++17 中自定义点的麻烦,所以我想知道 C++20 对此是否有任何更改。
我只关心语言变化让我可以更好地编写我的库,我认为 std::
没有变化由于向后兼容的原因。
为了使问题自成一体:这是我对帖子中提到的问题的糟糕回顾:
std::swap
而不是使用 std::swap; swap(a,b);
、template<size_t I> struct priority_tag : priority_tag<I-1> {}; template<> struct priority_tag<0> {};
最佳答案
在 C++20 之前,“定制点”是一种基于 ADL 的非正式习惯用语,C++ 标准库的各个部分有时会使用它。 C++20 创建了一个更正式的习语,具有更直接的实现。
但是 C++20 的适当定制点概念与 C++20 之前的习语相当不兼容。因此,它创建了新的自定义点,这些点在其新规则下运行:std::ranges::begin/end
, std::ranges::size
, ETC。
C++20 自定义点的性质是,您几乎可以在任何版本的 C++ 中使用该惯用语。 C++20 的概念使编写自定义版本更容易,但是您可以在大多数 C++ 版本中使用 SFINAE 中的一些内容来完成基本相同的事情。
C++20 customization points是函数对象,而不是常规的模板函数。因此,您不能重载函数本身。您可以使用成员函数或 ADL 可访问函数自定义自定义点,两者都必须使用所需的名称和接口(interface)。但这也意味着您不能自定义非用户定义的类型;自定义点类型本身必须为此类函数提供任何重载。
两者之间的主要不兼容在于调用自定义点,而不是如何自定义它。不需要 using
舞蹈。
关于c++ - C++20 是否改变了自定义点的编写方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64882411/