【发布时间】:2021-10-23 10:10:44
【问题描述】:
我已经滚动并搜索了 the standard 和 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) { /* ... */ }
,并且这个函数可以很容易地接受任何可转换为 A 的类型。但这很奇怪,因为第一个模板参数(“From”)基本上被删除了,并在函数调用时推导出来。下面这个函数也可以工作,我很确定它实际上等同于前一个
template<typename T, std::convertible_to<T> S>
void foo(S x) { /* ... */ }
当我们调用foo 时,再次推导出x 的类型。
尽管模板需要两个参数,但这仍然有效。我也试过std::derived_from,它似乎工作。这种只用一个模板参数指定概念的形式甚至出现在标准本身中,因此必须有一些语法来解释它。
请注意,存在的std::convertible_to 中的the only version 实际上是带有两个模板参数的。
谁能解释一下为什么会这样?
【问题讨论】:
标签: c++ templates constraints c++20 c++-concepts