`std::make_optional` 的重点是什么

bol*_*lov 12 c++ c++17 stdoptional ctad deduction-guide

std::make_通过引入类模板参数推导(除了make_uniquemake_shared),所有这些都被 C++17 变得多余。

那么重点是std::make_optional什么?至于我可以告诉它的确切同样的事情扣除导游的std::optional

有没有std::make_optional比演绎指南更受欢迎的场景?

Rus*_*lan 9

区别的一个例子是当你想要(无论出于何种原因)制作一个包含可选项的可选项时:

#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>>);
}
Run Code Online (Sandbox Code Playgroud)

  • [三星级程序员](https://wiki.c2.com/?ThreeStarProgrammer) - `std::Optional` 版本。接得好。 (4认同)
  • 不幸的是,通用代码需要库解决方案,因为核心语言选择了适合非通用情况的默认值。 (2认同)
  • @DavisHerring 你想要 `std::optional&lt;int&gt; a{}; auto x = std::Optional{a}` 为 `std::Optional&lt;std::Optional&lt;int&gt;&gt;` 和 `std:vector&lt;int&gt; v1{};auto v2 = std::vector{v1}` 为 `std::vector&lt;std::vector&lt;int&gt;&gt;`?`std::string s1{}; 会是什么?auto s2 = std::string{s1}` 是吗? (2认同)
  • @bolov 事实上,“向量{v1}”和“向量{v1,v1}”都是有效的并且类型截然不同,我认为这是一个错误。`string{s1}` 根本不是同一类东西,因为 `string` 实际上是一种类型。“tuple{x}” 的奖励积分是依赖于“x”的三个不同事物之一...... (2认同)