我正在从google(https://code.google.com/p/cpp-btree/)的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,它将是一个CompileAssert&lt;假&gt;大小为-1的数组,它将触发编译错误。
我没有得到的是bool(expr)部分,这究竟是什么?某种类型的bool类复制构造函数的调用? (但它是内置类型,所以我很困惑) 我虽然这可能是一种在expr不是布尔值时引发编译错误的机制,但实际上我设法编译一个短程序,该行
COMPILE_ASSERT("trash",error_compilation_assert);
用gcc 3.4编译就好了。
那么有人能解释一下该机制的bool(expr)部分吗?
答案 0 :(得分:4)
这是一种类型转换。 C ++中有3种主要类型的转换:
演员表示法(C风格演员):(bool) expr
功能表示法(构造函数样式):bool(expr)
强制转换运算符(C ++ - 样式转换); static_cast<bool>(expr)
演员表示法和功能表示法在语义上是等价的(即它们都执行最强的转换,C-cast),但范围和范围是功能表示法的优先顺序更加清晰。
通常建议不要在C ++代码中使用它们,而是使用特定的强制转换操作符(const_cast
,static_cast
等)。
因此,在您的代码中,它只是强制值键入bool
并同时将其括在括号中,以便不会出现运算符优先级问题。
答案 1 :(得分:3)
bool(expr)
将expr
投射到bool
。
答案 2 :(得分:1)
第一个参数应该是某种表达式,例如a == b
。在这里使用字符串文字是没用的。
bool(expr)
是一个函数式转换,它将表达式转换为bool。很多东西都隐含地转换为bool,但我猜他们想要一个显式的强制转换来确保结果是一个bool。
如果将指针转换为bool,如果它是NULL指针,则计算结果为false,否则为true。你的字符串文字“Trash”衰变成第一个字符的const char *
。由于这不是空指针,因此表达式的计算结果为true。
答案 3 :(得分:0)
bool(expr)尝试隐式或使用任何用户定义的转换运算符将expr转换为bool。
答案 4 :(得分:0)
在C ++中,您可以使用ctor语法实例化内置类型:
bool b1 = bool(true);
bool b2 = bool(b1);
区别于:
bool b2 = b1;
是后者隐式转换为bool。当不允许这样的隐式转换时(如模板中的typedef),bool(b1)
通过从bool
创建临时b1
使其显式化,而临时不必是bool
转换了;它是一个实际的{{1}}类型。