c++ - C++20 是否改变了自定义点的编写方式?

标签 c++ c++20 argument-dependent-lookup

我正在阅读这篇文章 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/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/

    相关文章:

    c++ - 有没有办法从一组图像中识别出不太相似的区域?

    c++ - 概念上的cv限定词需要表达式参数列表

    c++ - 基于 SFINAE 的运算符跨命名空间重载

    c++ - 如何从重载集中删除当前函数?

    c++ - 如何使用数组进行两次循环移位

    c++ - 为什么要使用未命名的命名空间,它们有什么好处?

    c++ - 编译 C++ 代码时如何解决版本控制问题?

    c++ - 您可以使用带有指定初始值设定项的显式构造函数吗?

    c++ - 通过 unsigned char[] 创建隐式对象 - reinterpret_cast 为隐式对象是否合法? (P0593)

    c++ - ADL 在特定情况下不起作用