对于从未实例化的模板中不正确使用非依赖名称,是否需要诊断?

Is a diagnostic required for incorrect uses of non-dependent names in a template that is never instantiated?

提问人:cigien 提问时间:10/25/2020 更新时间:10/25/2020 访问量:77

问:

以下是该标准对模板定义中非依赖名称的说明

模板定义中使用的非依赖名称使用通常的名称查找找到,并在使用它们时进行绑定。

[示例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++;

这是否意味着这实际上是格式错误的,不需要诊断

C++ 模板 language-lawyer dependent-name

评论


答:

3赞 Brian Bi 10/25/2020 #1

畸形 NDR 是畸形的特例。在示例中,类模板的定义显然格式不正确;是否需要诊断取决于是否在翻译单元中的任何位置发生实例化,该示例似乎与此无关(因为它承认可能存在实例化点)。如果确实存在实例化,则实现可以自由地在定义点或实例化点发出诊断。参见 [temp.res.general]/8ZZ

评论

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。例子不是规范性的,我怀疑写这个例子的人根本没有预料到混淆的可能性。