给定一个结构:
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
将使用 ()
而不是 {}
进行构造。据我所知,没有什么强有力的理由来选择这个。
emplace_alt
snd make_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} );
无需使用参数定义额外的构造函数。
距最初发布 8 年之后,它们似乎都有效!
使用 clang 16.0.0 和 c++20:https://godbolt.org/z/4aaaaf6aW