使用默认构造函数放置在向量中

新手上路,请多包涵

我想使用 vector::emplace 默认构造一个 不可复制不可分配的 对象,然后使用迭代器对新创建的对象使用对象上的特定方法。请注意,该类没有参数化构造函数,只有默认构造函数。一个简单的例子是:

 #include <iostream>
#include <vector>
using namespace std;

class Test {
public:
    Test() {}
private:
    Test(const Test&) = delete;             // To make clas un-copyable.
    Test& operator=(const Test&) = delete;

    int a_;
};

int main() {
    vector<Test> test_vec;
    test_vec.emplace_back();     // <---- fails

    return 0;
}

vector::emplace() 构造一个新对象,但需要非默认构造函数的参数。 vector::emplace_back() 将在向量的末尾构造。

有没有办法使用默认构造进行替换。有没有办法使用分段构造或默认转发,也许使用 std::piecewise_construct 就像地图一样?例如,在地图的情况下,我们可以使用:

 std::map<int,Test> obj_map;
int val = 10;
obj_map.emplace(std::piecewise_construct,
                std::forward_as_tuple(val),
                std::forward_as_tuple());

向量有类似的东西吗?

原文由 Chizzy C 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

正如@dyp 和@Casey 在评论中指出的那样, std::emplace 不适用于 Test 类的向量,因为该类既不可 移动 也不可 复制,因为“用户声明的复制构造函数抑制了默认值的生成移动构造函数”(@Casey)。

要在此处使用 emplace ,该类需要是可移动的或可复制的。我们可以通过显式定义(和默认)移动构造函数来使类可移动:

 public:
    Test(Test&& other) = default;
    Test& operator=(Test&& other) = default;

这也将隐式地使类 不可复制,“因为声明移动操作将抑制副本的隐式生成”。 (@凯西)

现在我们可以使用 std::emplace_back() 然后使用 vector::back() 调用新创建的对象的方法。

原文由 Chizzy C 发布,翻译遵循 CC BY-SA 4.0 许可协议

vector::emplace_back() 将在向量的末尾构造,但也需要参数。

参数包可以为空。因此,可变参数模板 emplace_back 可以不带参数调用; IE

 vector<VeryLimitedClass> vec;
vec.emplace_back();

是通过其默认构造函数初始化 VeryLimitedClass 类型的对象并将其“放置”在 vec 后面的有效代码。

原文由 Columbo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题