2016-10-06 26 views
0

需要一個類,它有一個數組作爲其私有數據成員之一。atomic - Deleted Copy構造函數

class A { 
    vector<atomic<int>> arr; 
    public: 
    A(int size, int init) : arr(vector<atomic<int>>(size,init)) {} 
     // Error: Deleted 'atomic(const atomic&)' (GCC) 
}; 

相當簡單,複製構造函數被刪除。我想要做的就是將arr中的每個條目初始化爲init。我能夠使用指針和動態分配來做到這一點。

class A { 
    atomic<int> *arr; 
    public: 
    A(int size, int init) : arr(new atomic<int>[size]) { 
     for (int i=0; i<size; ++i) arr[i]=init; // Not initialization, but works 
    } 
}; 

但我想做到這一點使用向量(C++雜交方式)。我嘗試明確分配向量元素,但即使vector::resize()vector::push_back()也需要一個拷貝。

class A { 
    vector<atomic<int>> arr; 
    public: 
    A(int size, int init) { 
     arr.resize(size); // Error: Deleted 'atomic(const atomic&)' (GCC) 
     for (int i=0; i<size; ++i) arr[i]=init; 
    } 
}; 

是否有任何黑客可能或指針之一是唯一的選擇?

謝謝。

+1

爲什麼不'ARR(大小,INIT)'? – SergeyA

+2

['emplace_back'](http://en.cppreference.com/w/cpp/container/vector/emplace_back)構建了適當的項目。不幸的是,由於潛在的需要重新分配,它還需要T是MoveInsertable,這是原子不能滿足的。 – jaggedSpire

回答

4

你可以做

A(int size, int init) : arr(size) 
{ 
    for (auto& e : arr) { 
     e = init; 
    } 
} 

Demo

+0

是的,它的工作原理。但是,再次,它不是最初期望的初始化。這個明確的任務可以避免嗎? – ibrahim5253