在从未实例化的模板中错误使用非依赖名称是否需要诊断?
Is a diagnostic required for incorrect uses of non-dependent names in a template that is never instantiated?
模板定义中关于非依赖名称的标准says如下:
Non-dependent names used in a template definition are found using the usual name lookup and bound at the point they are used.
[Example 1:
void g(double);
void h();
template<class T> class Z {
public:
void f() {
g(1); // calls g(double)
h++; // ill-formed: cannot increment function; this could be diagnosed
// either here or at the point of instantiation
}
};
void g(int); // not in scope at the point of the template definition, not considered for the call g(1)
— end example]
我对 h++;
上的评论感到困惑,上面写着“格式错误:...这可以在此处或在实例化时诊断 ”。如果实现选择后者,但没有模板的实例化怎么办?哪里可以确诊?
这是否意味着这实际上是格式错误,不需要诊断?
Ill-formed NDR 是 ill-formed 的一个特例。例子中class模板的定义Z
明明是ill-formed;是否需要诊断取决于 Z
的实例化是否发生在翻译单元的任何地方,该示例似乎对此不可知(因为它承认可能存在实例化点)。如果确实存在实例化,那么实现可以自由地在定义点或实例化点发出诊断。参见 [temp.res.general]/8。
模板定义中关于非依赖名称的标准says如下:
Non-dependent names used in a template definition are found using the usual name lookup and bound at the point they are used.
[Example 1:
void g(double); void h(); template<class T> class Z { public: void f() { g(1); // calls g(double) h++; // ill-formed: cannot increment function; this could be diagnosed // either here or at the point of instantiation } }; void g(int); // not in scope at the point of the template definition, not considered for the call g(1)
— end example]
我对 h++;
上的评论感到困惑,上面写着“格式错误:...这可以在此处或在实例化时诊断 ”。如果实现选择后者,但没有模板的实例化怎么办?哪里可以确诊?
这是否意味着这实际上是格式错误,不需要诊断?
Ill-formed NDR 是 ill-formed 的一个特例。例子中class模板的定义Z
明明是ill-formed;是否需要诊断取决于 Z
的实例化是否发生在翻译单元的任何地方,该示例似乎对此不可知(因为它承认可能存在实例化点)。如果确实存在实例化,那么实现可以自由地在定义点或实例化点发出诊断。参见 [temp.res.general]/8。