首页 > 解决方案 > C++20 是否改变了自定义点的编写方式?

问题描述

我正在阅读这篇关于 C++17 中自定义点的麻烦的文,所以我想知道 C++20 中是否对此有任何更改。

我只关心允许我更好地编写我的库的语言更改,我认为std::由于向后兼容性的原因没有任何更改。

为了使问题自成一体:这是我对帖子中提到的问题的糟糕回顾:

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

解决方案


在 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 自定义点是函数对象,而不是常规的模板函数。因此,您不能重载函数本身。您可以使用成员函数或 ADL 可访问函数自定义自定义点,两者都必须使用所需的名称和接口。但这也意味着您不能自定义非用户定义的类型;自定义点类型本身必须为此类函数提供任何重载。

两者之间的主要不兼容在于调用自定义点,而不是如何自定义它。没有必要using跳舞。


推荐阅读