【问题标题】:simple structs with make_unique and emplace_back带有 make_unique 和 emplace_back 的简单结构
【发布时间】:2016-11-14 08:18:29
【问题描述】:

给定一个结构:

struct S {
    int x;
    int y;
}

为什么标准允许我们这样做:

std::vector<S> vec;
vec.emplace_back(1, 2);

但不允许这样做:

auto ptr = std::make_unique<S>(1, 2);

?

【问题讨论】:

标签: c++ unique-ptr emplace


【解决方案1】:

实际上两者都不起作用。

决定 C++ 中的 emplace 样式构造函数 std 将使用 ()s 而不是 {}s 构造。没有强烈理由选择它(据我所知)。

emplace_alt snd make_unique_alt 可以添加到std,它使用{} 构造。 (自然应该选择更好的名字)

所以简短的回答是“因为std 这么说”。中等答案是“这是std 做出的近乎任意的选择,随后在其他地方保持一致”。长答案将涉及在它发生的房间和重新访问的地方:这不是一个长答案。

【讨论】:

    【解决方案2】:

    请检查您的代码。

    在 cpp14 中,您的示例代码无法编译:https://ideone.com/ewyHW6

    make_uniqueemplace_back 都在后台使用 std::forward&lt;Args&gt;(args)...,因此要么都编译要么都不编译。

    【讨论】:

    • @vladon 没有人是完美的。错误发生:-)
    【解决方案3】:

    怎么样

    auto ptr = std::make_unique&lt;S&gt;( S{1, 2} );

    不使用 args 定义额外的 ctor。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 2018-06-11
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多