Naw*_*waz 12 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;
}
Run Code Online (Sandbox Code Playgroud)
编译器是否other<true>在上述情况下实例化,实例化时似乎完全没必要?或者仅仅因为我编写了语法other<b>::value,编译器必须实例化它,而不管它是否对计算值的贡献完全没有贡献test<true>::value?
我想听听,a)标准需要什么,以及b)各种编译器实际实现了什么?标准的相关部分将不胜感激.
根据C++规范,$ 14.7.1/4节:
"如果在需要完全定义的对象类型的上下文中使用类类型,或者如果类类型的完整性影响程序的语义,则隐式实例化类模板特化;特别是,如果类型为a的表达式类模板特化涉及重载决策"
在你用短路说明的情况下,类必须有一个完整的类型,因为你在里面寻找值静态成员.这使编译器无法使表达式短路.
至于在实践中实际发生了什么,我不确定,因为我无法看到编译器如何在不进行实例化的情况下逃脱.例如,假设实例化other<b>看起来像这样:
template <bool B> struct other {
typedef int value;
};
Run Code Online (Sandbox Code Playgroud)
在这里,将形成不良的程序,因为other<b>::值是一个类型,而不是一个数值,但实际不执行实例化编译器不能诊断错误.
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |