make_unique 和 emplace_back 的简单结构
simple structs with make_unique and emplace_back
给定一个结构:
struct S {
int x;
int y;
}
为什么标准允许我们这样做:
std::vector<S> vec;
vec.emplace_back(1, 2);
但不允许这样做:
auto ptr = std::make_unique<S>(1, 2);
?
请检查您的代码。
在 cpp14 中,您的示例代码无法编译:https://ideone.com/ewyHW6
make_unique
和 emplace_back
都在后台使用 std::forward<Args>(args)...
,因此两者或 none 都可以编译。
实际上两者都不起作用。
已决定 C++ std
中的 emplace 样式构造函数将使用 ()
而不是 {}
来构造。没有 strong 选择它的原因(据我所知)。
emplace_alt
和 make_unique_alt
可以添加到 std
中,它使用 {}
构造。 (自然要取个好点的名字)
所以简短的回答是 "because std
says so"。中等答案是 "it is a near arbitrary choice made by std
, followed elsewhere to be consistent"。长答案将涉及到它发生的房间和重新访问的房间:这不是一个长答案。
怎么样
auto ptr = std::make_unique<S>( S{1, 2} );
没有用 args 定义额外的 ctor。
给定一个结构:
struct S {
int x;
int y;
}
为什么标准允许我们这样做:
std::vector<S> vec;
vec.emplace_back(1, 2);
但不允许这样做:
auto ptr = std::make_unique<S>(1, 2);
?
请检查您的代码。
在 cpp14 中,您的示例代码无法编译:https://ideone.com/ewyHW6
make_unique
和 emplace_back
都在后台使用 std::forward<Args>(args)...
,因此两者或 none 都可以编译。
实际上两者都不起作用。
已决定 C++ std
中的 emplace 样式构造函数将使用 ()
而不是 {}
来构造。没有 strong 选择它的原因(据我所知)。
emplace_alt
和 make_unique_alt
可以添加到 std
中,它使用 {}
构造。 (自然要取个好点的名字)
所以简短的回答是 "because std
says so"。中等答案是 "it is a near arbitrary choice made by std
, followed elsewhere to be consistent"。长答案将涉及到它发生的房间和重新访问的房间:这不是一个长答案。
怎么样
auto ptr = std::make_unique<S>( S{1, 2} );
没有用 args 定义额外的 ctor。