【发布时间】:2021-12-26 18:18:29
【问题描述】:
有一些讨论在 C++ 20 中很难看到模板参数的“种类”(我不想说类型,因为当涉及到模板时这是一个令人困惑的术语)。您可以阅读示例here。
我有点希望 C++ 允许垃圾邮件的方式来指定模板参数是概念(通过在其前面加上 concept 关键字,但这不起作用。
这是有原因的,还是没有人认为它会有用,因为它有点长?
struct S{
int x;
};
template <struct S s, /*concept*/std::integral>
struct S2{
auto f(){
return s.x;
}
};
int main() {
constexpr S s{47};
S2<s, short> s2;
return s2.f();
}
在这里我可以通过在 S 之前添加结构来提高可读性(恕我直言),但 std::integral 之前的概念无法编译。
【问题讨论】:
-
如果我不得不猜测的话,我会说这是因为你特别不应该这样想。您应该将
S2视为“采用S和std::integral”。其中一个是结构,一个是概念,这一事实是还原论的。满足这两个约束,你就很好了。 -
这是一个有趣的怪癖。
struct S s这里等同于class S s。现在,删除参数 nameclass S... aa,现在它是一个类型模板参数。一个标记将非类型参数和类型参数分开。我个人认为这种上下文敏感性很糟糕,因为我仍然希望有一天能将概念视为模板参数,我很高兴我们没有能力将概念关键字放在你可以展示的地方'不能放。
标签: c++ c++20 c++-concepts