boost::optional 对比 boost::make_optional

boost::optional vs boost::make_optional

我想更好地理解使用 default 构造函数创建 boost::optional 对象的区别:

boost::optional<PastaType> pasta = boost::optional<PastaType>(spaghetti)

或使用 make_optional 版本:

boost::optional<PastaType> pasta = boost::make_optional<PastaType>(spaghetti)

环顾四周,我只是了解到 make_optional 版本 PastaType 不能是引用类型,但我想弄清楚何时使用一个或其他.

谢谢!

make_optional 是一个方便或辅助函数,可以通过推断 optional 的模板参数来减少您必须编写的代码量。这两种方法在功能上是等价的。

auto pasta = boost::make_optional(spaghetti);

在 C++17 之前,您无法从 class 的初始化中推断出模板参数,就像您可以使用函数模板调用一样。

作为解决方法,以 make_thing 形式命名的函数构造了 thing 允许推导。

auto pasta = boost::make_optional(spaghetti); // pasta is boost::optional<PastaType>

auto pasta = boost::optional(spaghetti); // compile error before C++17, afterward pasta is boost::optional<PastaType>