【发布时间】:2018-07-31 15:12:56
【问题描述】:
[temp.deduct.type] paragraph 8 列出了所有推断的上下文,但似乎不包括 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() {}
这段代码编译了under Clang 7.0.0和GCC 8.0.1,这意味着编译器认为部分特化比主模板更特化,这意味着主模板中的U和V被成功推导到foo<U, U> .这是编译器错误吗?
【问题讨论】:
-
我得告诉你,这个标准有时真的很令人沮丧。 It seems to be taking us right back to where we started
-
@StoryTeller 现在没有函数调用。
-
没错。这就是为什么那段令人沮丧。
-
这条规则可能会导致某种形式的递归:[temp.deduct.type]/21
-
看起来您发现了一个标准错误。
template-name<TT>和TT<TT>都需要在那里。真的,他们(几乎)一直是,(希望)永远都是。例如,您很难找到不支持something like this 的合理编译器。这不是模板条款中最严重的问题,但仍然是一个问题。
标签: c++ templates language-lawyer template-argument-deduction