模板名称<TT>是推断的上下文吗?

xsk*_*xzr 7 c++ templates language-lawyer template-argument-deduction

[temp.deduct.type]第8段列出了所有推导出的上下文,但它似乎没有包括where 类引用类模板并引用模板模板参数.这是推断的背景吗?template-name<TT>template-nameTT

如果是,为什么?

如果没有,请考虑以下代码:

template<template<typename> class U, template<typename> class V>
struct foo {};

template<template<typename> class U>
struct foo<U, U> {}; 

int main() {}
Run Code Online (Sandbox Code Playgroud)

此代码编译锵7.0.0下GCC 8.0.1,这意味着编译器考虑部分特比主模板,这意味着更加专业化UV在主模板被成功地推导出对foo<U, U>.这是编译器错误吗?

T.C*_*.C. 6

这一段充满了问题,包括你指出的问题.核心问题2328有一个很好的清单:

17.9.2.5 [temp.deduct.type]第8段的呈现方式导致规范不清楚,不必要的冗长和不完整.具体问题包括:

  • 它是什么意思PA拥有一组表格之一?他们都必须有这种形式吗?(这不会发生;通常只P包含模板参数)

  • 在介绍性句子中,不是T,TT并且i应该是模板参数的名称而不是模板参数?

  • T[i],似乎我们可以推断i,但不是T(T只能在表格中推断)T[integer-constant]

  • 什么是integer-constant应该是什么?

  • 什么是cv-list

  • 为什么我们不能推断出const TT?(显然你只能推断出两种类型或两种类型都没有cv-list,无论cv-list是什么 类型.)

  • 我们有极端的冗余,因为,例如,没有办法说"在T (T::*)(T),你可以推断出任何这些T,如果某些职位没有T" ,那就没关系.所以我们有七种(!)形式的构造,对于所有情况,除了三个位置都不包含a的情况T.

  • 我们有针对成员函数的指针的特殊情况规则,即使它们不是特殊情况,并且应该由成员指针和函数规则的规则涵盖.

  • 我们不允许从模板模板参数中推导出模板模板参数的值 - 有TT<T>表单,TT<i> 表单,template-name<T>表单和 template-name<i>表单,但没有TT<TT>表单或template-name<TT>表单.

看起来编辑设法摆脱了cv-list,至少,自提出问题以来.它现在只是cv.(cv-list有点奇怪的错误,因为[语法]说-list后缀用于以逗号分隔的列表......)

  • @xskxzr巨大?也许是为了规范.不适用于实施. (3认同)