2

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

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

或使用make_optional版本:

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

环顾四周,我刚刚明白make_optional版本 PastaType 不能是引用类型,但我想更好地弄清楚何时使用其中一种。

谢谢!

4

2 回答 2

4

make_optional是一个方便或辅助函数,可以通过推断optional. 这两种方法在功能上是等价的。

auto pasta = boost::make_optional(spaghetti);
于 2021-04-01T16:15:57.603 回答
4

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

作为一种解决方法,以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>
于 2021-04-01T16:20:40.443 回答