• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

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

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

    関連項目

    参照