这是我无可救药地坚持的代码片段.
template <class T, T nt>
class C;
struct base{
int i;
} b;
struct derived : base{} d;
C<base*,&d> obj;
Run Code Online (Sandbox Code Playgroud)
为什么这会给出错误could not convert template argument &d to base*?
将参数与作为指针/引用的参数进行匹配时,即使转换在其他情况下有效,也不会考虑派生到基本转换.
14.3/5 [标准报价仅供参考]
如果非类型模板参数无法转换为相应模板参数的类型,则程序格式错误.
....
对于指向对象的类型指针的非类型模板参数,将应用限定转换(4.4)和数组到指针转换(4.2).[注意:特别是,既不应用空指针转换(4.10)也不应用派生到基础转换(4.10).虽然0是整数类型的非类型模板参数的有效模板参数,但它不是指针类型的非类型模板参数的有效模板参数.]