给出一个结构:
struct S {
int x;
int y;
}
为什么标准允许我们这样做:
std::vector<S> vec;
vec.emplace_back(1, 2);
但不允许这样做:
auto ptr = std::make_unique<S>(1, 2);
答案 0 :(得分:7)
实际上都没有工作。
决定C ++ std
中的emplace样式构造函数将构造为()
而不是{}
s。没有强烈的理由选择这个(我知道)。
emplace_alt
snd make_unique_alt
可以添加到使用std
构建的{}
。 (自然应该选择一个更好的名字)
所以简短的回答是“因为std
这么说”。中等答案是“这是std
几乎任意选择,其他地方一致”。很长的答案将涉及到它发生的房间和重新审视的地方:这不是一个很长的答案。
答案 1 :(得分:4)
请检查您的代码。
在cpp14中,您的示例代码无法编译:https://ideone.com/ewyHW6
server_timestamp
和make_unique
都在后台使用emplace_back
,因此无论是两者还是无人都会编译。
答案 2 :(得分:0)
怎么样
auto ptr = std::make_unique<S>( S{1, 2} );
不使用参数定义额外的构造函数。