Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memulakan Vektor dengan Jenis Move-Only dalam C dengan betul?

Bagaimana untuk Memulakan Vektor dengan Jenis Move-Only dalam C dengan betul?

DDD
Lepaskan: 2024-12-17 16:06:11
asal
913 orang telah melayarinya

How to Correctly Initialize a Vector with Move-Only Types in C  ?

Permulaan Vektor dengan Jenis Alih Sahaja

Pertimbangkan kod berikut, yang bertujuan untuk memulakan vektor dengan contoh std::unique_ptr:

#include <vector>
#include <memory>

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

Walau bagaimanapun, kod ini mencetuskan ralat semasa penyusunan dalam GCC 4.7, kerana std::unique_ptr tidak menyokong penyalinan dan pengkompil cuba membuat salinan penunjuk semasa pemula.

Gelagat GCC

Percubaan GCC untuk salin penunjuk boleh dianggap betul di bawah piawaian C semasa, yang tidak secara eksplisit menangani permulaan senarai senario untuk jenis bergerak sahaja seperti unique_ptr.

Kaedah Permulaan Alternatif

Untuk memulakan vektor dengan jenis bergerak sahaja dengan betul, seseorang boleh menggunakan pendekatan berikut:

Menggunakan Iterator:

Pendekatan ini melibatkan mencipta lelaran bergerak untuk senarai pemula dan menghantarnya kepada pembina vektor:

#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

Menggunakan rref_wrapper:

Teknik ini menggunakan jenis pembantu yang menyediakan storan sementara untuk rujukan pindah:

#include <utility>
#include <type_traits>

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&& _val;
};

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));
}

template<class T>
void rref(T&) = delete;

int main() {
  using move_only = std::unique_ptr<int>;
  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 Bagaimana untuk Memulakan Vektor dengan Jenis Move-Only dalam C dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan