第332章 has_value メンバー関数

std::optional のメンバー関数の中には has_value という空でない値があるかチェックする関数があります。

具体的には 文脈変換 をするための演算子オーバーロードとヘルパー関数の 2 種類があります。

constexpr explicit operator bool() const noexcept;
constexpr bool has_value() const noexcept;

前者は bool 値が想定される条件式において、値が空であれば false を返し、そうでなければ true を返します。

後者はメンバー関数と呼び出し、値が空であれば false を返し、そうでなければ true を返します。

では実装例を見てみましょう。

main.cpp. 

  1 #if __cplusplus < 201703L
  2 # pragma message "-std=c++17を指定してください"
  3 #endif
  4
  5 #include <optional>
  6 #include <iostream>
  7
  8 struct Foo {
  9   int x;
 10 };
 11
 12 int main()
 13 {
 14   Foo foo{20};
 15
 16   auto afoo = std::optional<Foo>(foo);
 17   afoo = {};
 18
 19   if(afoo)
 20     std::cout << afoo->x << '\n';
 21
 22   if(afoo.has_value())
 23     std::cout << afoo->x << '\n';
 24   else
 25     std::cout << "no value" << '\n';
 26
 27   return 0;
 28 }

ビルドと出力. 

$ g++ main.cpp -std=c++17
$ ./a.out
no value

まずは初期化です。

 16   auto afoo = std::optional<Foo>(foo);
 17   afoo = {};

afoo にはオブジェクトが無く空の状態です。

次に 文脈変換 の処理をします。

 19   if(afoo)
 20     std::cout << afoo->x << '\n';

afoo は演算子オーバーロードによって false に変換されます。

最後に has_value メンバー関数を使ってみます。

 22   if(afoo.has_value())
 23     std::cout << afoo->x << '\n';
 24   else
 25     std::cout << "no value" << '\n';

has_value は afoo が値のない空の状態のため false を返します。

Copyright 2017-2018, by Masaki Komatsu