簡體   English   中英

原子變量的矢量(數組)

[英]Vector(array) of atomic variables

我知道atomic的副本構造函數已被刪除,但是我該怎么做才能使此代碼起作用? 如何在vector中為atomic定義一個拷貝構造函數?

#include <atomic>
#include <vector>

int main() {
    std::vector<std::atomic<int>> examp;
    examp.resize(64);
}

您無法擁有std::atomic<int>的向量,因為它不可復制或不可移動,但是您可以擁有與atomic<int>的unique_ptrs的向量。 如果您確實需要原子的運行時可變大小矢量,那么這可能是一個可行的選擇。 這是一個例子:

#include <iostream>
#include <atomic>
#include <vector>
#include <memory>

using namespace std;

int main() {
    std::vector<std::unique_ptr<std::atomic<int>>> examp;
    examp.resize(64);   // 64 default unique_ptrs; they point to nothing

    // init the vector with unique_ptrs that actually point to atomics
    for (auto& p : examp) {
        p = std::make_unique<std::atomic<int>>(0);   // init atomic ints to 0
    }

    // use it
    *examp[3] = 5;

    for (auto& p : examp) {
        cout << *p << ' ';
    }
    cout << '\n';
}

std::atomic不可復制或移動。 如您所述,復制構造函數被刪除,但是沒有生成移動構造函數。 參見http://en.cppreference.com/w/cpp/language/move_constructor

如果沒有為類類型(struct,class或union)提供用戶定義的move構造函數,則以下所有條件均成立:

  • 沒有用戶聲明的副本構造函數;

用戶聲明的意思是“未由編譯器添加”(即default )。 即使它是一個庫類,構造函數也是由用戶聲明的。

向量的resize功能需要根據重載類型將其移動插入或復制插入。 參見http://en.cppreference.com/w/cpp/container/vector/resize

如果當前大小小於計數,

1)附加了其他默認插入的元素

2)附加附加值的副本

您正在做的事情根本行不通。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM