为什么这个静态断言不起作用?
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); }
我正在尝试使用 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); }