2016-12-04 6 views
0

Я пишу код для графических процессоров, поэтому я не могу использовать классы STL, потому что методам нужны специальные аннотации для работы на графическом процессоре. Итак, я переоцениваю std::array, с соответствующими аннотациями (INLINE) по его методам. Проблема у меня сейчас мой экземпляр конструктор вызывает оператор присваивания на членах:std :: array-like class copy constructor

template <typename T, Int n> 
class Few { 
    T array_[n]; 

public: 
    INLINE Few(Few<T, n> const& rhs) { 
    for (Int i = 0; i < n; ++i) array_[i] = rhs.array_[i]; 
    } 
}; 

Это работает хорошо для простых T, но есть тип, для которого это необходимо вызвать конструктор копирования, а не оператор присваивания , Как заставить компилятор скопировать конструкцию каждого элемента в массив?

+0

Would [станд :: uninitialized_copy_n] (http://en.cppreference.com/w/cpp/memory/uninitialized_copy_n) работать? – fun4jimmy

+0

@ fun4jimmy почти. его не аннотировали для графических процессоров, но я скопировал его реализацию, и это сработало. –

+2

На самом деле array_ уже был инициализирован по умолчанию, поэтому, вероятно, он недействителен для использования uninitialized_copy_n. – fun4jimmy

ответ

-3

Похоже, что с использованием оператора размещения нового оператора. Я не уверен, что это вполне законно в соответствии со стандартом С ++, но здесь это:

INLINE Few(Few<T, n> const& rhs) { 
    for (Int i = 0; i < n; ++i) new (array_ + i) T (rhs.array_[i]); 
    } 
+0

Iff вам нужно назвать место размещения новым, вы, вероятно, также должны вызвать dtor вручную. – Deduplicator

+2

Что произойдет, если конструктор по умолчанию по умолчанию T задает некоторую память? Я думаю, что вызов нового места по уже инициализированному значению может привести к его утечке? – fun4jimmy

+3

Это решение является правильным, если и только если вы переключитесь на 'std :: aligned_storage_t массив;' или 'charas (T) char array [n * sizeof (T)];'. Если у вас есть 'T array [n];', то вызов места размещения new - это неопределенное поведение, потому что компилятор вызывает конструкторы по умолчанию на тех же объектах, что и раньше. – HolyBlackCat

8

Как получить компилятор для копирования построить каждый элемент в массиве?

Это уже будет. Это именно то, что сделает здесь конструктор копии по умолчанию. Так что просто не указать себя, или явно по умолчанию это:

Few(Few const&) = default; 
+0

все сводится к аннотации 'INLINE' для графических процессоров. построение копии по умолчанию не имеет этой аннотации, поэтому мне нужен явный эквивалент. –