xsk*_*xzr 7 c++ templates language-lawyer template-argument-deduction
[temp.deduct.type]第8段列出了所有推导出的上下文,但它似乎没有包括where 类引用类模板并引用模板模板参数.这是推断的背景吗?template-name
<TT>
template-name
TT
如果是,为什么?
如果没有,请考虑以下代码:
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,这意味着编译器考虑部分特比主模板,这意味着更加专业化U
和V
在主模板被成功地推导出对foo<U, U>
.这是编译器错误吗?
这一段充满了问题,包括你指出的问题.核心问题2328有一个很好的清单:
17.9.2.5 [temp.deduct.type]第8段的呈现方式导致规范不清楚,不必要的冗长和不完整.具体问题包括:
它是什么意思
P
和A
拥有一组表格之一?他们都必须有这种形式吗?(这不会发生;通常只P
包含模板参数)在介绍性句子中,不是
T
,TT
并且i
应该是模板参数的名称而不是模板参数?在
T[i]
,似乎我们可以推断i
,但不是T
(T
只能在表格中推断)T[integer-constant]
什么是
integer-constant
应该是什么?什么是
cv-list
?为什么我们不能推断出
const T
从T
?(显然你只能推断出两种类型或两种类型都没有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后缀用于以逗号分隔的列表......)