C ++部分概念ID:第一个参数的显式模板规范顺序/特殊状态的原因是什么?
C++ partial concept id: What is the reason for the explicit template specification order / special status of first argument?
我开始试验概念的 C++20 功能,当我意识到可以部分显式地为概念提供模板参数时,我感到非常高兴。我阅读了 cppreference 文章,但没有找到那里提到的内容。
但后来我意识到了一些奇怪的事情:模板参数的规范顺序与我预期的相反。当提供一个显式模板参数时,它会替换模板列表中的第二个模板:
#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{});
}
从我的角度来看,部分提供显式模板参数的可能性是有道理的,因为反对 类 的部分模板规范的论点不适用于此处并使概念更通用。现在我想知道:
- 标准发布时是否允许部分显式模板规范(可能)?
- 这种规范顺序可能会保持不变还是这是一个错误?
- 我该如何为自己回答这个问题?据我了解,c++20 标准目前还没有准备好,我找到了 C++ Standard Committee Papers 的列表,我在其中简要搜索了 2020 年提出的标准的标题 'concept'。检查这些论文是可行的方法,还是有一个可访问的单一文档结合了作者目前同意的要点?
可以找到代码here。
编辑
发布后,我检查了指定三个模板参数时的行为。看起来我误解了规范顺序:第一个参数是 'held free' 包含要检查的参数,显式规范从第二个参数开始。这个可以看here。
即使我弄清楚了规范顺序背后的原因,我也会对上述问题的答案非常感兴趣。
是的,partial-concept-id肯定是 C++20 的东西。第一个参数的特殊状态虽然令人惊讶,但允许像 std::constructible_from
这样的情况被声明为
template<class T,class ...Args>
concept constructible_from=…;
std::constructible_from<int,int>
是一个 类型约束 要求 它引入的任何东西都可以从两个 int
构造争论。然而,它也可以是一个 表达式 ,在这种情况下它 报告 是否可以从 [=13= 构造一个 int
](剧透:true
),但无论参数顺序如何,都存在潜在的混淆。
如果 T
必须放在最后,就没有办法使用这样的概念:只有模板参数推导或默认模板参数可以为参数 [=31 之外的模板参数提供值=]pack,这里都不适用。
您链接的论文站点上发布的每封邮件都包含最新的标准草案,备用邮件包含关于采用哪些论文的注释。或者您可以访问 draft’s repository(至少如果您喜欢阅读 LaTeX)。
我开始试验概念的 C++20 功能,当我意识到可以部分显式地为概念提供模板参数时,我感到非常高兴。我阅读了 cppreference 文章,但没有找到那里提到的内容。
但后来我意识到了一些奇怪的事情:模板参数的规范顺序与我预期的相反。当提供一个显式模板参数时,它会替换模板列表中的第二个模板:
#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{});
}
从我的角度来看,部分提供显式模板参数的可能性是有道理的,因为反对 类 的部分模板规范的论点不适用于此处并使概念更通用。现在我想知道:
- 标准发布时是否允许部分显式模板规范(可能)?
- 这种规范顺序可能会保持不变还是这是一个错误?
- 我该如何为自己回答这个问题?据我了解,c++20 标准目前还没有准备好,我找到了 C++ Standard Committee Papers 的列表,我在其中简要搜索了 2020 年提出的标准的标题 'concept'。检查这些论文是可行的方法,还是有一个可访问的单一文档结合了作者目前同意的要点?
可以找到代码here。
编辑 发布后,我检查了指定三个模板参数时的行为。看起来我误解了规范顺序:第一个参数是 'held free' 包含要检查的参数,显式规范从第二个参数开始。这个可以看here。 即使我弄清楚了规范顺序背后的原因,我也会对上述问题的答案非常感兴趣。
是的,partial-concept-id肯定是 C++20 的东西。第一个参数的特殊状态虽然令人惊讶,但允许像 std::constructible_from
这样的情况被声明为
template<class T,class ...Args>
concept constructible_from=…;
std::constructible_from<int,int>
是一个 类型约束 要求 它引入的任何东西都可以从两个 int
构造争论。然而,它也可以是一个 表达式 ,在这种情况下它 报告 是否可以从 [=13= 构造一个 int
](剧透:true
),但无论参数顺序如何,都存在潜在的混淆。
如果 T
必须放在最后,就没有办法使用这样的概念:只有模板参数推导或默认模板参数可以为参数 [=31 之外的模板参数提供值=]pack,这里都不适用。
您链接的论文站点上发布的每封邮件都包含最新的标准草案,备用邮件包含关于采用哪些论文的注释。或者您可以访问 draft’s repository(至少如果您喜欢阅读 LaTeX)。