C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?

C++ partial concept id: What is the reason for the explicit template specification order / special status of first argument?

本文关键字:参数 第一个 顺序 是什么 状态 id 范顺序 C++      更新时间:2023-10-16

我开始尝试概念的 C++20 功能,当我意识到可以为概念部分显式提供模板参数时,我感到非常高兴。我阅读了 cpp偏好文章,但没有找到那里提到的内容。

但后来我意识到一些奇怪的事情:模板参数的规范顺序与我的预期相反。当提供一个显式模板参数时,它会替换模板列表中的第二个模板:

#include <concepts>
#include <type_traits>
/// Concept in order to deduce if sth. is base of sth else
template <typename Impl, typename Base>             //XXX: here the order of Impl and Base are not 
concept Implements = std::is_base_of_v<std::remove_reference_t<Base>, // what I would've expected.
std::remove_reference_t<Impl>>;
/// Example Base class impl
struct BaseExample {};
/// Implementation of BaseExample
struct ImplExample : BaseExample {};
/// Function in which the concept is applied
template <Implements<BaseExample>... Baes> void f(Baes &&... ) {}//} ((void)b, ...); }
int main() {
(void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample &&>>; //< true
(void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample&>>;  //< true
f(ImplExample{}, ImplExample{});
}

从我的角度来看,部分提供显式模板参数的可能性是有意义的,因为反对类的部分模板规范的论点在这里不适用,并且使概念更加通用。现在我想知道:

  1. 发布标准时,是否允许部分显式模板规范(可能(?
  2. 这个规范顺序可能会保持不变还是这是一个错误?
  3. 我该如何为自己回答这个问题?据我了解,c++20 标准现在还没有准备好,我找到了一份C++标准委员会论文的列表,其中我简要搜索了 2020 年提出的"概念"论文的标题。检查这些论文是要走的路,还是有一份可访问的单一文件,结合了作者目前同意的要点?

代码可以在这里找到。

编辑发布此内容后,我检查了指定三个模板参数时的行为。看起来我误解了规范顺序:第一个参数是"自由的"以包含要检查的参数,显式规范以第二个参数开头。这可以在这里看到。 即使我弄清楚了规范顺序背后的原因,我也会对上述问题的答案非常感兴趣。

是的,部分概念 id肯定是 C++20 的事情。 第一个论点的特殊地位虽然令人惊讶,但允许像std::constructible_from这样的情况被宣布为

template<class T,class ...Args>
concept constructible_from=…;

std::constructible_from<int,int>是一个类型约束它要求它引入的任何内容都可以从两个int参数构造。 但是,它也可以是表达式,在这种情况下,它会报告是否可以从int构造int(剧透:true(,但无论参数顺序如何,都存在潜在的混淆。

如果T必须放在最后,就没有办法使用这样的概念:只有模板参数推导或默认模板参数可以为参数之外的模板参数提供值,而这些都不适用于此处。

在您链接的论文网站上发布的每封邮件都包括标准的最新草案,备用邮件包括有关采用哪些论文的注释。 或者你可以访问草稿的存储库(至少如果你喜欢阅读LaTeX的话(。