【发布时间】:2013-12-07 12:21:09
【问题描述】:
代码示例:
template <int x>
struct SUM
{
static_assert(x >= 0, "X must be greater or equal to 0");
enum {VALUE = x + SUM<x-1>::VALUE};
};
template<>
struct SUM<0>
{
enum {VALUE = 0};
};
int main()
{
std::cout << SUM<-1>::VALUE << std::endl;
return 0;
}
为什么编译器不会在第一个 static_assert 上中断编译而是继续工作直到达到最大实例化深度?
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/Main.d" -MT"src/Main.d" -o "src/Main.o" "../src/Main.cpp"
../src/Main.cpp: In instantiation of ‘struct SUM<-1>’:
../src/Main.cpp:47:22: required from here
../src/Main.cpp:26:2: error: static assertion failed: X must be greater or equal to 0
static_assert(x >= 0, "X must be greater or equal to 0");
^
......
../src/Main.cpp: In instantiation of ‘struct SUM<-2>’:
../src/Main.cpp: In instantiation of ‘struct SUM<-900>’:
../src/Main.cpp:27:18: recursively required from ‘struct SUM<-2>’
../src/Main.cpp:27:18: required from ‘struct SUM<-1>’
../src/Main.cpp:47:22: required from here
../src/Main.cpp:26:2: error: static assertion failed: X must be greater or equal to 0
../src/Main.cpp:27:18: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) instantiating ‘struct SUM<-901>’
enum {VALUE = x + SUM<x-1>::VALUE};
^
../src/Main.cpp:27:18: recursively required from ‘struct SUM<-2>’
../src/Main.cpp:27:18: required from ‘struct SUM<-1>’
../src/Main.cpp:47:22: required from here
../src/Main.cpp:27:18: error: incomplete type ‘SUM<-901>’ used in nested name specifier
make: *** [src/Main.o] Error 1
13:04:05 Build Finished (took 6s.877ms)
这里唯一的问题是它需要很长时间才能中断,并且会产生很多输出。有没有办法让它变得更好?使用的编译器:gcc 4.8.1版
【问题讨论】:
-
你知道
-Wfatal-errors吗? -
@zch 我最近有它向我指出
-Wfatal-errors中止太 用于自动脚本以外的用途。实际错误消息后面的相关信息也将被省略。 -
@Ali Ha,这正是我向我指出的地方。它可以被认为是重复的,但我认为不是,因为即使问题相似,答案也会有所不同:我的答案是我在 cmets 中提到的一个坏主意,但我认为它是一个很好的方法。 :)
标签: c++ templates c++11 static-assert