2012-09-22 11 views
3

根据此页面: http://womble.decadent.org.uk/c++/template-faq.html#non-dependent “非依赖名称是那些被认为不依赖于模板参数的名称,以及模板本身的名称和在其中声明的名称(成员,朋友和本地变量)”C++ 98标准在哪里指定本地声明的模板名称不相关?

这似乎是由一个事实,即下面的代码被认为是有效的(由LLVM /科莫)

template<typename T> 
struct Template 
{ 
    typedef int I; 
    typedef Template::I Type; // 'Template' is NOT dependent 
    typedef Template<T>::I Type2; // 'Template<T>' is NOT dependent 
    Template<T>* m; 
    void f() 
    { 
     m->f(); // 'm' is NOT dependent 
    } 
}; 

备份花一些时间阅读的C++ 98标准后,我找不到在哪里这个行为指定。我希望在'temp.nondep'下找到这个提及。

+0

请注意,由于C++ 11现在有一堆关于“名称指当前实例*如果”涉及这种用法的语言。 –

回答

1

C++ 98标准没有定义“非依赖”,“非依赖”或“非依赖”名称(可以在标准文本中找到所有三种形式)的含义。

相反,它选择定义什么名称和类型依赖于14.6 [temp.res]及其子章节中的模板参数。应用简单的逻辑......不被认为是依赖的一切都是非依赖的。只有阅读14.6.3 [temp.nondep]没有帮助。

+1

重读14.6 [temp.res]回答我的问题:“在模板定义中可以使用三种名称: - 模板本身的名称以及在模板本身内声明的名称 - 依赖于模板的名称-parameter - 在模板定义中可见的范围名称。“这意味着该模板的名称被排除在“取决于模板参数的名称”集上。 – willj

+0

@willj是的,你确实比我更清楚地回答了你自己的问题。 :) –