7

给定一个结构:

struct S {
    int x;
    int y;
}

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

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

但不允许这样做:

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

?

4

3 回答 3

9

实际上两者都不起作用。

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

emplace_altsndmake_unique_alt可以添加到std它构造使用的地方{}。(自然应该选择一个更好的名字)

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

于 2016-07-12T08:26:28.183 回答
5

请检查您的代码。

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

两者make_unique都在后台emplace_back使用std::forward<Args>(args)...,所以要么都编译,要么都不编译。

于 2016-07-12T07:57:47.163 回答
0

怎么样

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

无需使用 args 定义额外的 ctor。

于 2021-06-16T19:31:06.187 回答