繁体   English   中英

为什么类型约束 `std::convertible_to` 只能与一个模板参数一起使用?

[英]Why can the type constraint `std::convertible_to` be used with only one template argument?

我已经滚动并搜索了标准cppreference数小时但无济于事,如果有人能为我解释这种情况,我将不胜感激:

我正在查看标准概念std::convertibe_to 这是一个我理解的简单例子

class A {};
class B : public A {};

std::convertible_to<A, B>; // false
std::convertible_to<B, A>; // true

按预期工作。

现在还有另一种可能的使用方式,我不太明白

void foo(std::convertible_to<A> auto x) { /* ... */ }

,而这个 function 可以很容易地接受任何可转换为 A 的类型。但这很奇怪,因为第一个模板参数(“From”)基本上被删除,并在 function 调用中推导出来。 下面的 function 也可以,我很确定它实际上等同于前一个

template<typename T, std::convertible_to<T> S>
void foo(S x) { /* ... */ }

当我们调用foo时,再次推断出x的类型。

这有效,尽管模板需要两个参数。 我也尝试使用std::derived_from并且它似乎有效。 这种仅使用一个模板参数来指定概念的形式甚至出现在标准本身中,因此必须有一些语法来解释它。

请注意,唯一存在的std::convertible_to版本实际上是采用两个模板参数的版本。

谁能澄清为什么这有效?

void foo( constraint<P0, P1, P2> auto x );

这大致转化为

template<contraint<P0, P1, P2> X>
void foo( X x );

大致翻译为

template<class X> requires constraint<X, P0, P1, P2>
void foo( X x );

请注意类型X是如何添加到约束的模板arguments之前的。

所以在你的情况下,

template<typename T, std::convertible_to<T> S>
void foo(S x) { /* ... */ }

大致是

template<typename T, class S>
requires std::convertible_to<S, T>
void foo(S x) { /* ... */ }

(我粗略地说,因为我相信它们在微妙的方面并不完全等同。例如,第二个引入了名称X ,而第一个则没有。而且可能还有其他类似规模的差异;我的意思是理解翻译将使您了解翻译的内容。这与for(:)循环与for(;;)循环对应不同;标准根据for(;;)循环指定for(:)循环,这不是这不是我上面所说的。)

在模板参数列表中未提供模板概念的第一个参数的情况下,可以在多个位置使用concept名称。 约束auto推导的变量就是其中之一。

这些情况下的第一个参数由某个表达式提供,通常使用模板参数推导规则。 在受约束的 function 参数的情况下,第一个参数由模板 function 本身确定。 也就是说,如果您调用foo(10) ,模板参数推导会将auto模板参数推导为int 因此,完整的概念将是convertible_to<int, A>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM