考虑这段代码,
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)各种编译器实际上实现的是什么?标准的相关部分将不胜感激。
答案 0 :(得分:9)
根据C ++规范,$ 14.7.1 / 4节:
“类模板专业化是 如果是类,则隐式实例化 type用于上下文中 需要一个完全定义的对象 键入或者如果完整性 类类型会影响语义 该计划;特别是,如果一个 类型为类的表达式 涉及模板专业化 重载决议“
如果你说明了短路,那么这个类必须有一个完整的类型,因为你在里面查找它来找到值静态成员。这使编译器无法使表达式短路。
至于在实践中实际发生的事情,我不确定,因为我无法看到编译器如何在不进行实例化的情况下逃脱。例如,假设other<b>
的实例化如下所示:
template <bool B> struct other {
typedef int value;
};
在这里,您的程序将是格式错误的,因为other<b>
:: value是一个类型,而不是一个值,但编译器无法在没有实际执行实例化的情况下诊断错误。