2013-04-11 87 views
24

在的C++ 11标准6.8.3,它说:C++ 11模板参数misbind的示例?

如果 在分析过程中,在模板参数的名称是不同的约束比它的试用 解析,在节目中的约束是不合格的。

什么是由于此要求而不合格的程序示例?

+15

“试用解析”是当你不购买完整版本的编译器。 – 2013-04-11 06:44:34

+0

请参阅下面的评论以了解'trial parse'的实际定义。 – 2013-04-11 16:08:42

回答

27
#include <iostream> 
#include <typeinfo> 

typedef const int cint; 

template <int a> struct x 
{ 
    static cint b = 0; 
}; 

template <> struct x<42> 
{ 
    typedef cint b; 
}; 

cint w = 17; 

int main() 
{ 
    cint (w)(42), (z)(x<w>::b); 

    std::cout << typeid(z).name() << std::endl; 
} 

第一个声明在main()需要被消除歧义,以进行试用解析。在这个解析过程中,本地w是未知的,因为解析纯粹是语法的(事物只被解析,没有语义动作被执行)。因此,w是一个全局常量,其值为17,x<w>::b是一个值,而z是一个变量。

在真正的语法分析过程中,会发生语义动作。因此,名称w绑定到刚刚声明的本地常量,其值为42,x<w>::b成为类型,并且z是函数声明。

+0

(+1)编译器是否需要发出诊断? 'gcc 4.7.2'没有。 – NPE 2013-04-11 07:24:01

+0

“如果在解析过程中,模板参数中的名称的绑定方式与试用解析期间绑定的名称不同,则该程序不合格,不需要进行诊断。” – zakinster 2013-04-11 07:24:52

+0

是的,它在审判期间被评估。我没有看到任何要求抛出错误,标准说“不需要诊断”。 – 2013-04-11 08:25:11