C++ 中的 static_assert


static_assert 是一个函数,对程序员很有用,可以在编译程序后在屏幕上打印错误,而不会太多地混淆输出。

早期的 C++11 和 C++14 标准中,static_assert 有一些不同的用法,这意味着我们必须在定义 static_assert 时自己编写消息。但 C++17 中可以调用 static_assert 而无需传递消息。

它也与其他断言库函数兼容,如 BOOST_STATIC_ASSERT。

语法

{
   auto __range= For-range-Intializer;
   auto __begin= begin-expression;
   auto __end= end-expression;
   for(; __begin!= __end; ++__begin){
      range-declaration= *__begin;
      statement
   }
}

__begin 和 __end 的类型将有所不同;仅仅需要比较运算符。该改动对已有的 for 循环没有影响,但却为库提供了更多选择。例如,这么一点改动可以让 range TS(以及 C++20 中的 range)可以和基于范围的 for 循环一起使用。

在 C++11 中基于范围的for 循环 −

for (for-range-declaration : for-range-initializer){
   statement;
}

在 C++14 标准中,这种循环表达式等效于以下代码 −

{
   auto __range = for-initializer;
   for ( auto __begin= begin-expresson, __end = end-expression; __begin != __end; ++__begin ){
      for-range-declaration = *__begin;
         statement
   }
}

范例

#include <bits/stdc++.h>
using namespace std;
template <typename T, size_t n, typename F> //Template Declaration
void fillarray (array<T, N> & a, F && f) //Function to store the values{
   static_assert(is_convertible<typename result_of<F()>::type, T>::value,"Incompatible type returned by fun()"); //static_assert signature to ommit the errors.
   for (auto x : a)
      x = f();
}
int main (){
   array<vector<string>, 20> a;
   fillarray(a, []() { return vector<string>{"TutorialsPoint"}; });
   return 0;
}

输出

…
…
…
prog.cpp:20:61: required from here
prog.cpp:10:5: error: static assertion failed:
Incompatible type returned by fun()

更新时间:2021 年 2 月 5 日

323 次浏览

开启您的 职业生涯

完成课程以获得认证

开始
广告
© . All rights reserved.