【发布时间】:2021-11-23 23:21:02
【问题描述】:
如果在带有非类型模板参数的函数模板的声明中,该非类型模板参数用于函数参数列表中的子表达式,则该表达式是如上所述的非推导上下文。
这意味着f的以下声明
template<int> struct S {};
template<int i> void f(S<i + 1>) {}
电话f(S<42>{}) 是rejected。
但是,如果f的声明改为
template<int i> void f(S<(i)>) {}
只有 Clang rejects 调用,和以前一样的错误。
那么,在i 周围添加括号是否使其成为非推导上下文,因为i 是(i) 的子表达式?
【问题讨论】:
标签: c++ language-lawyer template-argument-deduction