我正在阅读有关blogpost的有关C++ 17中自定义点的麻烦的信息,所以我想知道C++ 20是否对此进行了任何更改。
我只关心语言的更改,使我可以更好地编写我的库,我认为由于向后兼容的原因,std::没有任何更改。
使问题自成一体:这是我对帖子中提到的问题的不恰当的总结:

  • ADL舞蹈解决方案很容易出错(例如,调用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/endstd::ranges::size等。
    C++ 20定制点的性质使得您几乎可以在任何C++版本中使用该惯用法。 C++ 20的概念使编写自定义版本更加容易,但是您可以在大多数C++版本中使用SFINAE中的某些功能来完成基本相同的事情。
    C++20 customization points是函数对象,而不是常规模板函数。因此,您不能重载函数本身。您可以使用成员函数或ADL可访问函数自定义定制点,这两个函数都必须使用所需的名称和接口(interface)。但是,这也意味着您无法自定义非用户定义的类型。定制点类型本身必须为此类功能提供任何重载。
    两者之间的不兼容性原则在于调用定制点,而不是您如何定制它。不需要using跳舞。

    关于c++ - C++ 20是否会更改定制点的编写方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64882411/

    10-09 06:34
    查看更多