【发布时间】:2021-10-07 20:28:10
【问题描述】:
C++20 允许程序为模板模板参数指定概念。例如,
#include <concepts>
template <typename T> concept Char = std::same_as<T, char>;
template <typename> struct S {};
template <template <Char U> typename T, typename U> T<U> foo() { return {}; }
int main() { foo<S, int>(); }
函数foo 的第一个模板参数应该是一个单参数模板。
概念Char 被定义为只有char 类型为真,因此满足int 的尝试将失败。以上程序仍被所有编译器接受:https://gcc.godbolt.org/z/PaeETh6GP
能否请您解释一下,为什么可以指定模板模板参数中的概念,但仍然会被忽略?
【问题讨论】:
-
这里只是猜测,但可能出于同样的原因,可以指定内部参数的名称但它被忽略。您可以将这些概念应用于示例中的“第二个”
U,它可以按预期工作。另请注意,没有有效实例的模板是格式错误的 NDR。 -
我的猜测是
template <False U> typename T要求,只要满足False<U>,T<U>就有效,即vacuously true。换句话说,typename U隐含False U,而False<U>隐含True<U>(True是typename的概念对应物)。当T与T<U>一样使用时,直接使用T所指的模板(即S),绕过模板模板参数中的False。 (见contravariance) -
可以简化为that(去掉
U)IMO。 -
参见标准草案中的this 示例。
-
@Fedor 您的示例格式错误,NDR 因为
False永远不会满足。重复的问题不是关于替换失败,而是关于为什么程序格式错误,NDR。这是结束问题的糟糕借口,因为真正的问题与 NDR 无关。以这样一种方式重写问题,使约束只在某些时候得到满足,这样它就不再是病态的了。
标签: c++ c++20 c++-concepts contravariance template-templates