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
840 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!

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