实例化模板时短路?

时间:2011-01-05 03:24:47

标签: c++ templates instantiation short-circuiting

考虑这段代码,

template<bool b>
struct other
{
    static const bool value = !b;
};

template<bool b>
struct test
{
    static const bool value = b || other<b>::value;
};

int main()
{
      bool value = test<true>::value;   
}

编译器是否在上述情况下实例化other<true>,实例化时似乎完全没必要?或者仅仅因为我编写了语法other<b>::value,编译器必须实例化它,而不管它对test<true>::value的值的计算没有任何贡献?

我想听听,a)标准是什么需要,b)各种编译器实际上实现的是什么?标准的相关部分将不胜感激。

1 个答案:

答案 0 :(得分:9)

根据C ++规范,$ 14.7.1 / 4节:

  

“类模板专业化是   如果是类,则隐式实例化   type用于上下文中   需要一个完全定义的对象   键入或者如果完整性   类类型会影响语义   该计划;特别是,如果一个   类型为类的表达式   涉及模板专业化   重载决议“

如果你说明了短路,那么这个类必须有一个完整的类型,因为你在里面查找它来找到值静态成员。这使编译器无法使表达式短路。

至于在实践中实际发生的事情,我不确定,因为我无法看到编译器如何在不进行实例化的情况下逃脱。例如,假设other<b>的实例化如下所示:

template <bool B> struct other {
    typedef int value;
};

在这里,您的程序将是格式错误的,因为other<b> :: value是一个类型,而不是一个值,但编译器无法在没有实际执行实例化的情况下诊断错误。