带有 make_unique 和 emplace_back 的简单结构

问题描述 投票:0回答:4

给定一个结构:

struct S {
    int x;
    int y;
}

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

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

但不允许这样做:

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

c++ unique-ptr emplace
4个回答
10
投票

实际上两者都不起作用。

决定 C++ 中的 emplace 式构造函数

std
将使用
()
而不是
{}
进行构造。据我所知,没有什么强有力的理由来选择这个。

emplace_alt
snd
make_unique_alt
可以添加到
std
中,并使用
{}
进行构造。 (自然应该选择一个更好的名字)

所以简短的答案是“因为

std
这么说”。中等答案是“这几乎是
std
做出的任意选择,在其他地方也遵循以保持一致”。长答案将涉及到事件发生和重新访问的房间:这不是一个长答案。


5
投票

请检查您的代码。

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

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


0
投票

怎么样

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

无需使用参数定义额外的构造函数。


0
投票

距最初发布 8 年之后,它们似乎都有效!

使用 clang 16.0.0 和 c++20:https://godbolt.org/z/4aaaaf6aW

© www.soinside.com 2019 - 2024. All rights reserved.