2

我正在从谷歌的 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 不是布尔值时引发编译错误的机制,但实际上我设法在该行编译了一个短程序

COMPILE_ASSERT("trash",error_compilation_assert);

它用 gcc 3.4 编译得很好

那么任何人都可以解释机制的 bool(expr) 部分吗?

4

5 回答 5

4

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

  • 转换符号(C 样式转换):(bool) expr

  • 功能表示法(构造函数类型转换):bool(expr)

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

转换表示法和函数表示法在语义上是等价的(即它们都执行最强的转换,即 C 转换),但函数表示法的范围和优先级更清楚。

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

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

于 2013-09-19T12:13:23.247 回答
3

bool(expr)转换exprbool.

于 2013-09-19T12:09:10.963 回答
1

第一个参数应该是某种表达式,例如a == b. 在这里使用字符串文字是没有用的。

bool(expr)是一种函数式转换,将表达式转换为布尔值。很多东西都隐式转换为布尔值,但我想他们想要一个显式转换来确保结果是布尔值。

如果将指针转换为布尔值,如果它是 NULL 指针,则它的计算结果为 false,否则为 true。您的字符串文字“垃圾”衰减为const char *第一个字符。由于这不是空指针,因此表达式的计算结果为真。

于 2013-09-19T12:13:08.517 回答
0

bool(expr) 尝试将 expr 转换为 bool 隐式或使用任何用户定义的转换运算符。

于 2013-09-19T12:09:52.163 回答
0

在 C++ 中,您可以使用 ctor 语法实例化内置类型:

bool b1 = bool(true);
bool b2 = bool(b1);

区别在于:

bool b2 = b1;

是后者隐式转换为布尔值。当不允许这样的隐式转换时(如在模板 typedef 中),则通过创建一个临时frombool(b1)使其显式化,并且不再需要转换该临时;这是一个实际的类型。boolb1bool

于 2013-09-19T12:09:58.223 回答