提问人:cigien 提问时间:10/25/2020 更新时间:10/25/2020 访问量:77
对于从未实例化的模板中不正确使用非依赖名称,是否需要诊断?
Is a diagnostic required for incorrect uses of non-dependent names in a template that is never instantiated?
问:
以下是该标准对模板定义中非依赖名称的说明:
模板定义中使用的非依赖名称使用通常的名称查找找到,并在使用它们时进行绑定。
[示例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)
— 结束示例]
我对评论说“格式错误:......这可以在这里或实例化时诊断出来”。如果实现选择了后者,但没有模板的实例化,该怎么办?在哪里可以诊断?h++;
这是否意味着这实际上是格式错误的,不需要诊断?
答:
3赞
Brian Bi
10/25/2020
#1
畸形 NDR 是畸形的特例。在示例中,类模板的定义显然格式不正确;是否需要诊断取决于是否在翻译单元中的任何位置发生实例化,该示例似乎与此无关(因为它承认可能存在实例化点)。如果确实存在实例化,则实现可以自由地在定义点或实例化点发出诊断。参见 [temp.res.general]/8。Z
Z
评论
0赞
cigien
10/25/2020
好的,所以这个项目符号涵盖了上面的例子,对吗?
0赞
Brian Bi
10/25/2020
@cigien我相信 8.1 和 8.4 都涵盖了它,但我不是这两点背后的微妙之处的专家。
0赞
cigien
10/25/2020
没错,8.1 似乎也涵盖了这一点。我认为这可以解释它,但我会暂时不接受答案。谢谢:)
0赞
cigien
10/25/2020
等等,IFNDR应该明确说明吧?IF不意味着需要诊断吗?
0赞
Brian Bi
10/25/2020
@cigien 在案文的规范性部分,是的。每当文本说某些东西格式不正确时,就隐含地要求进行诊断。因此,只有当明确说明 NDR 部分时,它才能是格式错误的 NDR。例子不是规范性的,我怀疑写这个例子的人根本没有预料到混淆的可能性。
评论