我正在阅读来自谷歌的 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_cast
、static_cast
等)。
因此在您的代码中,这只是一种强制值键入 bool
的方法并将其同时括在括号中,这样就不会出现运算符优先级问题。
关于c++ - 在 C++ 中使用模板的编译时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18894087/