このページは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