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

时间:2013-09-19 12:01:51

标签: c++ templates

我正在从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)部分吗?

5 个答案:

答案 0 :(得分:4)

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

  • 演员表示法(C风格演员):(bool) expr

  • 功能表示法(构造函数样式):bool(expr)

  • 强制转换运算符(C ++ - 样式转换); static_cast<bool>(expr)

演员表示法和功能表示法在语义上是等价的(即它们都执行最强的转换,C-cast),但范围和范围是功能表示法的优先顺序更加清晰。

通常建议不要在C ++代码中使用它们,而是使用特定的强制转换操作符(const_caststatic_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}}类型。