Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态\u断言\u失败做什么?_C++_Templates - Fatal编程技术网

C++ 静态\u断言\u失败做什么?

C++ 静态\u断言\u失败做什么?,c++,templates,C++,Templates,我试图理解SAT解算器(miniSAT)的开源实现。在其中一个头文件中,我遇到了以下代码片段 template <bool> struct STATIC_ASSERTION_FAILURE; template <> struct STATIC_ASSERTION_FAILURE<true>{}; #define TEMPLATE_FAIL STATIC_ASSERTION_FAILURE<false>() 模板结构静态断言失败; 模板结构静态断言

我试图理解SAT解算器(miniSAT)的开源实现。在其中一个头文件中,我遇到了以下代码片段

template <bool> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true>{};
#define TEMPLATE_FAIL STATIC_ASSERTION_FAILURE<false>()
模板结构静态断言失败;
模板结构静态断言失败{};
#定义模板\u失败静态\u断言\u失败()
我无法理解这到底是怎么回事。从我对模板的理解来看,它们通常具有

template <class T> 
模板
但是在网上查找了一些东西之后,我发现模板可以通过使用

template <datatype> 
模板
在这种情况下,数据类型是bool。但我无法完全理解这样一个代码的作用。我对第二行和第三行尤其感到困惑

在代码前面,模板_FAIL用于泛型类的方法,如下所示:-

// Don't allow copying (error prone):
vec<T>&  operator = (vec<T>& other) { TEMPLATE_FAIL; }
         vec        (vec<T>& other) { TEMPLATE_FAIL; }
//不允许复制(容易出错):
向量和运算符=(向量和其他){TEMPLATE_FAIL;}
vec(vec&other){TEMPLATE_FAIL;}
这个特定的代码片段似乎是某些库的一部分,用于检查断言失败。但是,在模板、构造器等方面,我无法完全理解这一点(如果问题格式缺乏一些东西,请给出我如何改进问题格式的建议)


多谢各位

这是一个专门的模板。未定义基本模板
STATIC\u ASSERTION\u FAILURE
,但定义了专门化
STATIC\u ASSERTION\u FAILURE
。因此,当且仅当
expr
是编译时常量
true
时,才定义
静态断言失败

实际上,这意味着定义了
STATIC\u ASSERTION\u FAILURE
,但没有定义
STATIC\u ASSERTION\u FAILURE
。因此,后者是链路错误


C++11为此引入了
static\u assert
。它倾向于给出更清晰的错误信息

这是一个专门的模板。未定义基本模板
STATIC\u ASSERTION\u FAILURE
,但定义了专门化
STATIC\u ASSERTION\u FAILURE
。因此,当且仅当
expr
是编译时常量
true
时,才定义
静态断言失败

实际上,这意味着定义了
STATIC\u ASSERTION\u FAILURE
,但没有定义
STATIC\u ASSERTION\u FAILURE
。因此,后者是链路错误

C++11为此引入了
static\u assert
。它倾向于给出更清晰的错误消息

模板结构静态断言失败
声明一个模板类,该类接受一个布尔模板参数

模板结构静态断言失败{}
是传递的模板参数为true时的
静态断言失败
的特化

最好用一个例子来理解这是为了什么

假设我们有一个类型特征,它检查类型是否是指针,比如
type\u traits
标题中的
std::is\u pointer

std::is_pointer<int>::value == false
std::is_pointer<int*>::value == true
现在您可以看到,如果我们在一些有效的上下文中使用这些
静态断言失败
实例化,那么当我们尝试使用映射到
静态断言失败的任何东西时,我们将得到一个翻译错误
模板结构静态断言失败
声明一个模板类,该类接受一个布尔模板参数

模板结构静态断言失败{}
是传递的模板参数为true时的
静态断言失败
的特化

最好用一个例子来理解这是为了什么

假设我们有一个类型特征,它检查类型是否是指针,比如
type\u traits
标题中的
std::is\u pointer

std::is_pointer<int>::value == false
std::is_pointer<int*>::value == true

现在您可以看到,如果我们在一些有效的上下文中使用这些
静态\u断言\u失败
实例化,当我们试图使用任何映射到
静态断言失败

的东西时,我们会得到一个翻译错误,我很确定这是不对的,因为
静态断言失败
与只说
向量
是一样的,即它不会编译<代码>静态断言失败()可能会。对于
2+2==5
来说,这实际上是一个编译时错误。下面是我如何理解模板作为泛型类使用的。类T就像一个占位符,它代表了任何一个想要使用泛型类的类。现在在这个例子中,不是我们的课。这是我的理解。我们必须定义bool的所有可能值。这里有目的的静态断言失败没有给出定义?我正在看一段旧的源代码,以便更好地理解它。所以它绝对是前C++。11@MichaelAnderson:True,不能仅通过添加分号来使用类型。这不是一个有效的说法。但是,您可以添加
()
默认创建它,假设您在允许表达式的范围内。@ameyask86:不定义
静态断言\u失败
是故意的。请参阅编辑。我很确定这并不完全正确,因为
静态断言\u失败
就是说
向量
——也就是说,它不会编译<代码>静态断言失败()可能会。对于
2+2==5
来说,这实际上是一个编译时错误。下面是我如何理解模板作为泛型类使用的。类T就像一个占位符,它代表了任何一个想要使用泛型类的类。现在在这个例子中,不是我们的课。这是我的理解。我们必须定义bool的所有可能值。这里有目的的静态断言失败没有给出定义?我正在看一段旧的源代码,以便更好地理解它。所以它绝对是前C++。11@MichaelAnderson