c++ - 在 C++ 中使用模板的编译时断言

标签 c++ templates

我正在阅读来自谷歌的 cpp-btree 库 ( https://code.google.com/p/cpp-btree/ ) 的代码,我遇到了编译时断言机制。

// A compile-time assertion.
template <bool>
  struct CompileAssert {
};

#define COMPILE_ASSERT(expr, msg) \
  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

所以我或多或少地理解它的作用,如果编译器将 expr 评估为 false,它将声明一个新类型 msg,它将是一个大小为 -1 的 CompileAssert < false > 数组,这将触发编译错误。

我没有得到的是 bool(expr) 部分,这到底是什么?对类 bool 的复制构造函数的某种调用? (但它是内置类型所以我很困惑) 我虽然这将是一种在 expr 不是 bool 值时引发编译错误的机制,但实际上我设法用那一行编译了一个短程序

COMPILE_ASSERT("trash",error_compilation_assert);

它在 gcc 3.4 下编译得很好

那么谁能解释一下机制的 bool(expr) 部分?

最佳答案

这是一种类型转换。 C++ 中主要有 3 种类型转换:

  • 转换符号(C 风格转换):(bool) expr

  • 函数符号(构造函数式转换):bool(expr)

  • 转换运算符(C++ 风格的转换); static_cast<bool>(expr)

Cast 符号和函数符号在语义上是等价的(即它们都执行最强的转换,C-cast),但函数符号的范围和优先级更清晰。

通常建议不要在 C++ 代码中使用它们,而是使用特定的强制转换运算符(const_caststatic_cast 等)。

因此在您的代码中,这只是一种强制值键入 bool 的方法并将其同时括在括号中,这样就不会出现运算符优先级问题。

关于c++ - 在 C++ 中使用模板的编译时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894087/

相关文章:

c++ - 可以处理大输入(2 GB)的 JSON 解析器?

c++ - 无法使用 cstdio 在 C++ 中使用双变量

c++ - 在函数内部,调用它的重载版本

c++ - 在头文件中包含一个字符串作为函数的参数? C++

templates - 在 Angular 2 的 html 模板中引用服务是一种好习惯吗?

c++ - 是否可以使模板自动将 C 字符串转换为 C++ 字符串对象?

c++ - 什么是 HID_REPORT_DESCRIPTOR?

templates - dart angular2-模板中的迭代

c++ - 根据模板函数类型推断变量类型

c++ - C++ 中转换函数模板参数推导的含义