gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:10:26 24 4
gpt4 key购买 nike

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

#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 模板类,如下所示:

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++ - 为什么这个静态断言不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com