首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么类型约束`std::convertible_to`只能与一个模板参数一起使用?

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

Stack Overflow用户
提问于 2021-08-23 00:37:11
回答 2查看 872关注 0票数 23

我已经浏览了几个小时的标准优先选择,但没有结果,如果有人能为我解释一下这件事,我会非常感激的:

我看的是标准概念std::convertibe_to。以下是我理解的一个简单的例子

代码语言:javascript
运行
复制
class A {};
class B : public A {};

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

按预期工作。

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

代码语言:javascript
运行
复制
void foo(std::convertible_to<A> auto x) { /* ... */ }

,这个函数可以很容易地接受转换为A的任何类型,这很奇怪,因为第一个模板参数("From")被必要地删除,并在函数调用中推导出来。下面的函数也可以工作,而且我非常肯定它实际上相当于上一个函数

代码语言:javascript
运行
复制
template<typename T, std::convertible_to<T> S>
void foo(S x) { /* ... */ }

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

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

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

有人能解释一下为什么会这样吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-23 01:00:52

代码语言:javascript
运行
复制
void foo( constraint<P0, P1, P2> auto x );

这大致转化为

代码语言:javascript
运行
复制
template<contraint<P0, P1, P2> X>
void foo( X x );

大致翻译为

代码语言:javascript
运行
复制
template<class X> requires constraint<X, P0, P1, P2>
void foo( X x );

注意X类型是如何加到约束的模板参数中的。

所以在你的情况下

代码语言:javascript
运行
复制
template<typename T, std::convertible_to<T> S>
void foo(S x) { /* ... */ }

大致是

代码语言:javascript
运行
复制
template<typename T, class S>
requires std::convertible_to<S, T>
void foo(S x) { /* ... */ }

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

票数 17
EN

Stack Overflow用户

发布于 2021-08-23 01:01:11

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68886164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档