为什么这个静态断言不起作用?

Why does this static assert not work?

我正在尝试使用 C++11 之前的静态断言。我找到了 this and this 个问题,但不知为何我无法得到它 运行:

#define STATIC_ASSERT(x) \
    do { \
        const static char dummy[(x)?1:-1] = {0};\
    } while(0)

struct bar {
    int value;
    template<typename T> void setValue(T x);
};
template<typename T> void bar::setValue(T x) { STATIC_ASSERT(1==0); }
template<> void bar::setValue(int x) { value = x;}

int main(){
    bar b;
    int c = 1;
    b.setValue(c);    
}

编译此 (gcc) 结果为

error: size of array 'dummy' is negative

我希望只有当我用 int 以外的任何东西调用 setValue 时才会出现此错误。我还尝试了其他建议的解决方案,但或多或​​少得到了相同的结果:即使我不使用 int 以外的任何实例化模板,错误仍然存​​在。我究竟做错了什么?

如果模板对每次实例化都无效,则程序格式错误,无需诊断。因此,GCC 在这里给你一个错误是完全有效的,因为无论模板参数是什么,setValue 的主模板都是无效的。

解决这个问题的方法是使 STATIC_ASSERT 表达式依赖于模板参数。一种选择是制作一个 dependent_false 模板 class,像这样:

template <typename T> struct dependent_false 
{ const static bool value = false; };

template<typename T> void bar::setValue(T x) 
{ STATIC_ASSERT(dependent_false<T>::value); }