我有以下template metaprogramming实施的factorial:
#include <iostream>
template <int n> struct factorial{
static const int res = n*factorial<n-1>::res;
};
template <> struct factorial<0>{
static const int res = 1;
};
int main(){
std::cout << factorial<5>::res << '\n';
return 0;
}
此代码成功编译并输出120,如预期的那样。但是,出于纯粹自我享受的原因,我想改为使不编译,而是在编译器的错误消息中显示120.
是否存在一个简单的语法错误我可以故意输入我的代码以使其无法编译但仍然在编译器错误消息中打印5!的值,即120?
我预计答案可能取决于编译器;我目前正在使用Xcode Mac OSX附带的g ++,iirc是clang的前端。
答案 0 :(得分:8)
您可以使用声明但未定义的模板将该值打印为编译时错误。
template<int n>
class display;
template<int n> struct factorial{
static const int res = n*factorial<n-1>::res;
};
template<> struct factorial<0>{
static const int res = 1;
};
int main()
{
display<factorial<5>::res> value;
}
g ++输出:
g++ -std=c++11 fact.cxx
fact.cxx: In function ‘int main()’:
fact.cxx:14:29: error: aggregate ‘display<120> value’ has incomplete type and cannot be defined
display<factorial<5>::res> value;
^
答案 1 :(得分:4)
如果允许选项-Werror
或警告计为错误,则:
#include <iostream>
template <int n> struct factorial{
static const int res = n*factorial<n-1>::res;
};
template <> struct factorial<0>{
static const int res = 1;
};
int main(){
char x[factorial<5>::res];
return x[sizeof(x)];
}
将产生错误/警告
错误:'x [120ul]'在此函数中未初始化使用[-Werror = uninitialized]
使用gcc 5.3或
错误:数组索引120超过数组的末尾(包含120个元素)[ - 错误,-Warray-bounds]
使用clang 3.8。