【发布时间】:2020-04-26 16:13:02
【问题描述】:
我正在尝试使用 C++20 概念来开始熟悉它们。
我对简单的概念感觉很舒服,例如使用标准概念movable 我可以写这样的东西(在所有示例中,我想我是using namespace std,我包括<concepts> 和任何其他需要的标题):
template<movable T>
int foo (T obj);
并确保在调用此函数时传递的对象obj 可以移动。
我什至可以写成更长的形式:
template<typename T>
requires movable<T>
int foo (T obj);
结果是一样的(我认为)。
但是现在让我们看看另一个概念,例如same_as。 same_as 需要 2 个模板参数(要比较的 2 种类型),所以我可以这样写:
template<typename T>
requires same_as<T, string>
int bar (T obj);
现在 T 是 string。但是我怎样才能用更短的形式来写呢?我试过了,我可以写这个(正如我直觉预期的那样):
template<same_as<string> T>
int bar (T obj);
但是这种形式背后的正式规则是什么?
函数模板参数的名称 (T) 是否作为概念模板的第一个参数输入?或者也许是最后一次?我不知道,关于这个主题的信息很少。我的意思是,在这个例子中它是无关紧要的,因为 same_as<A, B> is semantically equivalent 到 same_as<B, A>,但在某些情况下,顺序很重要。
我知道有类似标题的问题,例如this one,但它问的是不同的东西。
这些是我试图从中获取信息但失败的资源:@987654323@、cppModernes、open-std (I browsed years 2018, 2019 and 2020) 和 this post。
【问题讨论】:
标签: c++ templates c++20 c++-concepts