auto之前的概念连词?

Conjunction of concepts before auto?

我正在学习 C++20 概念。有没有办法在 auto 之前就地结合概念?例如,如果我有一个 MutableGraph<G> 概念和一个 VertexListGraph<G> 概念,我可以定义

template <typename G>
concept MutableVertexListGraph = MutableGraph<G> && VertexListGraph<G>;

并做

MutableVertexListGraph auto g = ...;

但是当我只是想让它模拟这两个概念时,命名这个概念很烦人。要是能做就好了

MutableGraph && VertexListGraph auto g = ...; // && not allowed here.

甚至类似

template <typename T, concept... Concepts> // <- "concept" not allowed here.
concept ModelsAll = (Concepts<T> && ...);
...
ModelsAll<MutableGraph, VertexListGraph> auto g = ...;

我当然可以

MutableGraph auto g = ...;
requires { MutableGraph<decltype(g)>; };

缺乏对称性,或

auto g = ...;
requires { MutableGraph<decltype(g)>; MutableGraph<decltype(g)>; };

声明行缺少概念。

不,在对推导变量定义的类型应用约束时无法组合概念。

ConceptName auto variable = ...; 相当可读。 ConceptName 可能是不言自明的,它为变量定义留出了足够的空间。

Concept1 && Concept2 && Concept3 auto variable = ...; 可读性差很多。在这一点上,概念序列挤出了语句中真正重要的部分:变量声明。因此,将其拆分为多个语句更有意义:

auto variable = ...;
static_assert(Concept1<decltype(variable)> && Concept2<decltype(variable)> && Concept3<decltype(variable)>);

这涉及非常不幸的 decltype 用法(额外的 using 语句可以避免),但它确实分离了关注点,使 variable 声明本身更具可读性.