4

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

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

[示例 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++;”的评论感到困惑。如果实现选择后者,但没有模板的实例化怎么办?这要在哪里诊断?

这是否意味着这实际上是不正确的,而不需要诊断

4

1 回答 1

3

病态 NDR 是病态的一个特殊情况。在示例中,类模板的定义Z显然是错误的;是否需要诊断取决于实例化是否Z发生在翻译单元中的任何位置,该示例似乎不知道这一点(因为它承认可能存在实例化点)。如果确实存在实例化,则实现可以自由地在定义点或实例化点发布诊断。见[temp.res.general]/8

于 2020-10-25T00:35:16.917 回答