Skip to content

Latest commit

 

History

History
58 lines (40 loc) · 1.79 KB

lambda_to_noexcept_function_pointer.md

File metadata and controls

58 lines (40 loc) · 1.79 KB

noexcept付きのラムダ式から変換する関数ポインタにnoexceptを付加する

  • cpp17[meta cpp]

このページはC++17に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

キャプチャを持たない非ジェネリックなラムダ式は、関数ポインタに変換できる。そのラムダ式が例外を投げない指定をされていた場合、変換された関数ポインタもまたnoexceptを持つ。

例外を投げない指定とは、以下のいずれかである:

  • noexcept
  • noexcept(true)
  • throw() (C++17から非推奨)

#include <iostream>
#include <iomanip>

int main()
{
  int (*fp0)()          = []()          { return 0; };
  int (*fp1)() noexcept = []() noexcept { return 1; };

  std::cout << std::boolalpha;
  std::cout << noexcept(fp0()) << std::endl;
  std::cout << noexcept(fp1()) << std::endl;

  // noexcept付きラムダからnoexceptなし関数ポインタへは変換可能
  int (*fp2)() = []() noexcept { return 2; };

  // noexceptなしラムダからnoexcept付き関数ポインタへは変換不可
//int (*fp3)() noexcept = []() { return 3; };
}

出力

false
true

参照