静态断言

断言意味着应该检查一个条件,如果它是假的,那就是一个错误。对于 static_assert(),这是编译时完成的。

template<typename T>
T mul10(const T t)
{
    static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
    return (t << 3) + (t << 1);
}

static_assert() 有一个强制性的第一个参数,即条件,即 bool constexpr。它可能有第二个参数,即消息,即字符串文字。从 C++ 17 开始,第二个参数是可选的; 在此之前,它是强制性的。

Version >= C++ 17

template<typename T>
T mul10(const T t)
{
    static_assert(std::is_integral<T>::value);
    return (t << 3) + (t << 1);
}

它用于:

  • 通常,在 constexpr 值的某些类型上需要在编译时进行验证
  • 模板函数需要验证传递给它的类型的某些属性
  • 有人想为以下内容编写测试用例:
    • 模板元功能
    • constexpr 功能
    • 宏元编程
  • 某些定义是必需的(例如,C++版本)
  • 移植遗留代码,关于 sizeof(T) 的断言(例如,32 位 int)
  • 程序运行需要某些编译器功能(打包,空基类优化等)

请注意,static_assert() 不参与 SFINAE :因此,当可能有额外的重载/特化时,不应使用它而不是模板元编程技术(如 std::enable_if<>)。当已经找到预期的重载/特化时,它可能在模板代码中使用,但需要进一步的验证。在这种情况下,它可能提供比依赖 SFINAE 更具体的错误消息。