🚀

[[noreturn]]

2022/04/09に公開

[[noreturn]]は、関数が決して返らないことを示すための属性です。

用途は

  • コンパイラの最適化
  • return文の省略

"return文の省略"ということを掘り下げていきます。例外処理を書いていて戻り値がないとコンパイラに怒られてしまい意味のない戻り値を追加したことはないでしょうか。

void throw_error()
{
  throw std::runtime_error("error~~~");;
}

int func()
{
  int ret = /*何か処理*/
  if (ret > -1) {
    return 1;
  }
  
  // 例外投げるだけだからreturnは不要
  throw_error();
  
  // だけどコンパイラに怒られるためreturn追加
  return -1;
}

このようなとき[[noreturn]]を使うとコンパイラの警告を止めることができます。returnを返さないときに使うので例外をthrowするだけの関数を作った時は使うという使い方ができます。

[[noreturn]] void throw_error()
{
  throw std::runtime_error("error~~~");;
}

int func()
{
  int ret = /*何か処理*/
  if (ret > -1) {
    return 1;
  }
  
  // コンパイラもreturnがないことを知っているため怒らない
  throw_error();
}

Discussion