给定一个结构:
struct S {
int x;
int y;
}
为什么标准允许我们这样做:
std::vector<S> vec;
vec.emplace_back(1, 2);
但不允许这样做:
auto ptr = std::make_unique<S>(1, 2);
?
给定一个结构:
struct S {
int x;
int y;
}
为什么标准允许我们这样做:
std::vector<S> vec;
vec.emplace_back(1, 2);
但不允许这样做:
auto ptr = std::make_unique<S>(1, 2);
?
实际上两者都不起作用。
决定 C++ 中的 emplace 样式构造函数std
将使用()
s 而不是{}
s 构造。没有充分的理由选择这个(据我所知)。
emplace_alt
sndmake_unique_alt
可以添加到std
它构造使用的地方{}
。(自然应该选择一个更好的名字)
所以简短的回答是“因为std
这么说”。中等答案是“这是由 做出的近乎任意的选择std
,然后在其他地方保持一致”。长答案将涉及在它发生的房间和重新访问的地方:这不是一个长答案。
请检查您的代码。
在 cpp14 中,您的示例代码无法编译:https ://ideone.com/ewyHW6
两者make_unique
都在后台emplace_back
使用std::forward<Args>(args)...
,所以要么都编译,要么都不编译。
怎么样
auto ptr = std::make_unique<S>( S{1, 2} );
无需使用 args 定义额外的 ctor。