Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memulakan Vektor dengan Jenis Alih Sahaja dalam C ?

Bagaimanakah Saya Boleh Memulakan Vektor dengan Jenis Alih Sahaja dalam C ?

Linda Hamilton
Lepaskan: 2025-01-01 08:55:09
asal
871 orang telah melayarinya

How Can I Initialize a Vector with Move-Only Types in C  ?

Bolehkah Permulaan Vektor dengan Jenis Pergerakan Sahaja Dicapai?

Persoalan timbul apabila cuba memulakan vektor dengan penunjuk unik, satu langkah -taip sahaja. Apabila menemui kod seperti ini:

#include <vector>
#include <memory>

using move_only = std::unique_ptr<int>;
std::vector<move_only> v { move_only(), move_only(), move_only() };
Salin selepas log masuk

GCC 4.7 berusaha untuk menyalin penunjuk unik daripada senarai pemula, menghasilkan percubaan salinan yang tidak dibenarkan kerana sifat bergerak sahaja std::unique_ptr .

Pendekatan GCC: Adakah Cacat?

Niat GCC untuk menyalin penunjuk adalah betul, memandangkan penunjuk unik tidak boleh disalin. Walau bagaimanapun, kaedah yang digunakannya, menyalin daripada senarai pemula, mencetuskan pembina salinan yang dipadamkan.

Penyelesaian Alternatif Menggunakan Make Move Iterator

Untuk mengendalikan jenis gerak sahaja dalam pemulaan vektor, pendekatan pilihan melibatkan penggunaan make move iterator:

#include <iterator>
#include <vector>
#include <memory>

int main(){
  using move_only = std::unique_ptr<int>;
  move_only init[] = { move_only(), move_only(), move_only() };
  std::vector<move_only> v{std::make_move_iterator(std::begin(init)),
      std::make_move_iterator(std::end(init))};
}
Salin selepas log masuk

Iterators diperolehi daripada make move iterator memudahkan pergerakan elemen semasa penyahrujukan, menyelesaikan masalah dengan menyalin.

Penyelesaian Alternatif Menggunakan Pembungkus Templat

Satu lagi pendekatan melibatkan penggunaan pembungkus templat dengan nilai r semantik rujukan:

// Helper type for converting rvalues to lvalues
template<class T>
struct rref_wrapper
{
  explicit rref_wrapper(T&& v)
    : _val(std::move(v)) {}

  explicit operator T() const{
    return T{ std::move(_val) };
  }

private:
  T&amp;&amp; _val;
};

// Helper function to convert rvalues to rref_wrappers
template<class T>
typename std::enable_if<
  !std::is_lvalue_reference<T>::value,
  rref_wrapper<T>
>::type rref(T&& v){
  return rref_wrapper<T>(std::move(v));
}

// Helper function to delete lvalue references
template<class T>
void rref(T&amp;) = delete;
Salin selepas log masuk

Walaupun penyelesaian ini menyediakan cara untuk menukar secara konsep rnilai kepada lnilai, adalah penting untuk berhati-hati kerana ketidaktentuannya. Permulaan yang lebih ringkas boleh dicapai melalui proses dua langkah:

std::initializer_list<rref_wrapper<move_only>> il{ rref(move_only()),
                                                   rref(move_only()),
                                                   rref(move_only()) };
std::vector<move_only> v(il.begin(), il.end());
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memulakan Vektor dengan Jenis Alih Sahaja dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan