std::make_
C++17 引入了Class 模板参数推导(除了make_unique
and make_shared
) ,使所有这些都变得多余。
那么有什么意义std::make_optional
呢?据我所知,它与std::optional
.
是否存在std::make_optional
优先于扣除指南的情况?
std::make_
C++17 引入了Class 模板参数推导(除了make_unique
and make_shared
) ,使所有这些都变得多余。
那么有什么意义std::make_optional
呢?据我所知,它与std::optional
.
是否存在std::make_optional
优先于扣除指南的情况?
差异的一个示例是当您想要(无论出于何种原因)制作一个包含可选的可选时:
#include <optional>
#include <type_traits>
int main()
{
auto inner=std::make_optional(325);
auto opt2=std::make_optional(inner); // makes std::optional<std::optional<int>>
auto opt3=std::optional(inner); // just a copy of inner
static_assert(std::is_same_v<decltype(opt2), std::optional<std::optional<int>>>);
static_assert(std::is_same_v<decltype(opt3), std::optional<int>>);
}
另一个使用 for 的示例是std::make_optional()
构造存储在 a 中的对象,std::optional
而当它的构造函数接受多个参数时,不为其创建临时对象。
例如,考虑以下Point3D
类,其构造函数有多个参数:
struct Point3D {
Point3D(int xx, int yy, int zz): x(xx), y(yy), z(zz) {}
int x, y, z;
};
想象一下,您想将 a 存储的对象初始化std::optional<Point3D>
为Point3D(1, 2, 3)
X,那么您可以这样进行:
std::optional oPoint = Point3D(1, 2, 3);
但是,这会创建一个Point3D
临时对象,然后将其移动到std::optional
. 相反,通过使用std::make_optional()
便捷函数模板,您可以避免创建该临时函数:
auto oPoint = std::make_optional<Point3D>(1, 2, 3);
由于我们在这里讨论的是 C++17(即std::optional
在 C++17 中引入),因此这里适用保证复制省略,因此不会Point3D
创建临时对象。
请注意,您仍然可以std::make_optional()
通过传递std::in_place
给对象的构造函数来避免创建临时对象而不使用std::optional<Point3D>
:
std::optional<Point3D> oPoint{std::in_place, 1, 2, 3};
这将在原地Point3D
构造存储的对象,从而避免创建临时对象。不过,您可能会发现这比使用.std::make_optional()
Xstd::optional<Point3D> oPoint(1, 2, 3);
无法编译。