namespace std {
template <class T>
constexpr optional<see below> make_optional(T&& v); // (1)
template <class T, class... Args>
constexpr optional<T> make_optional(Args&&... args); // (2)
template <class T, class U, class... Args>
constexpr optional<T> make_optional(
std::initializer_list<U> il,
Args&&... args); // (3)
}
概要
有効な値を保持するoptional
オブジェクトを構築する。
- (1) : 型
T
の値を受け取り、それを有効値として保持するoptional
オブジェクトを構築する - (2) : 型
T
のコンストラクタ引数を受け取り、関数内でT
オブジェクトを構築し、それを有効値として保持するoptional
オブジェクトを構築する - (3) : 型
T
のコンストラクタ引数として初期化子リストと任意個の引数を受け取り、関数内でT
オブジェクトを構築し、それを有効値として保持するoptional
オブジェクトを構築する
効果
- (1) :
return optional<decay_t<T>>(std::forward<T>(v))
- (2) :
return optional<T>(in_place, std::forward<Args>(args)...);
と等価の処理を行う - (3)
return optional<T>(in_place, il, std::forward<Args>(args)...);
と等価の処理を行う
例
#include <cassert>
#include <optional>
#include <type_traits>
#include <string>
#include <vector>
int main()
{
// (1)
{
auto p = std::make_optional("Hello");
static_assert(std::is_same_v<decltype(p), std::optional<const char*>>);
}
// (2)
{
auto p = std::make_optional<std::string>(3, 'A');
assert(p.value() == "AAA");
static_assert(std::is_same_v<decltype(p), std::optional<std::string>>);
}
// (3)
{
std::allocator<int> alloc;
auto p = std::make_optional<std::vector<int>>({3, 1, 4}, alloc);
assert(p.value()[0] == 3);
assert(p.value()[1] == 1);
assert(p.value()[2] == 4);
static_assert(std::is_same_v<decltype(p), std::optional<std::vector<int>>>);
}
}
xxxxxxxxxx
#include <cassert>
#include <optional>
#include <type_traits>
#include <string>
#include <vector>
int main()
{
// (1)
{
auto p = std::make_optional("Hello");
static_assert(std::is_same_v<decltype(p), std::optional<const char*>>);
}
// (2)
{
auto p = std::make_optional<std::string>(3, 'A');
assert(p.value() == "AAA");
static_assert(std::is_same_v<decltype(p), std::optional<std::string>>);
}
// (3)
{
std::allocator<int> alloc;
auto p = std::make_optional<std::vector<int>>({3, 1, 4}, alloc);
assert(p.value()[0] == 3);
assert(p.value()[1] == 1);
assert(p.value()[2] == 4);
static_assert(std::is_same_v<decltype(p), std::optional<std::vector<int>>>);
}
}
出力
バージョン
言語
- C++17
処理系
- Clang: 4.0.1 ✅
- GCC: 7.2 ✅
- ICC: ??
- Visual C++: ??