【发布时间】:2011-06-03 18:54:49
【问题描述】:
考虑一下这段代码sn-p,
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) 各种编译器 实际上 实现了什么?标准中的相关部分将不胜感激。
【问题讨论】:
-
根据“C++ 模板:完整指南”第 307 页,看起来,至少根据标准,不,编译器不会短路这个表达式,并且确实会评估两者分支机构。我不确定这是为什么或者这里更普遍的原则是什么,但这可能至少是您问题的部分答案。
-
标准不允许他们在这里做“短路”。这就是为什么你需要自己实现它,就像done here。原因很简单:您需要知道
other<b>::value的类型以及它是否完全可以转换为bool并且有意义。为此,other<b>需要被实例化。如果它的类型会屈服于被调用的重载op||怎么办?那么初始化器将是无效的。
标签: c++ templates instantiation short-circuiting