Fungsi std::make_
dalam standar, seperti:
std::make_unique
danstd::make_shared
std::make_tuple
std::make_from_tuple
semuanya menggunakan inisialisasi tanda kurung bulat secara internal, bukan tanda kurung kurawal.
Misalnya, make_from_tuple
seperti yang disajikan oleh standar memilih untuk mengembalikan T(params...)
daripada dari T{params...}
.
Hasilnya adalah hal-hal berikut ini ilegal:
auto vec = std::make_from_tuple<std::vector<int>>(std::make_tuple());
auto arr = std::make_from_tuple<std::array<int, 2>>(std::make_tuple(9, 8));
^pembuatan std::array
dari tuple
, seperti di atas, adalah ilegal juga dengan C++20, seperti p0960 - memungkinkan inisialisasi agregat dari daftar nilai yang diberi tanda kurung menjadi bagian dari spesifikasi C++20 tidak mengizinkan inisialisasi untuk std::array
, karena tipe dalamnya adalah T[size]
yang tidak dapat diinisialisasi dari daftar nilai (tanda kurung telah dihapus oleh inisialisasi std::array
).
Jika ini berhasil, pemilihan inisialisasi tanda kurung vs. tanda kurung kurawal memiliki arti:
auto vec2 = std::make_from_tuple<std::vector<int>>(std::make_tuple(2, 3));
// a vector with the values: {3, 3} surprise? :-)
(Di atas tentu saja adalah contoh mainan. Tupel yang disediakan mungkin disediakan secara eksternal).
Dengan curly_make_from_tuple
suka:
template<typename T, typename tuple_t>
constexpr auto curly_make_from_tuple(tuple_t&& tuple) {
constexpr auto get_T = [](auto&& ... x){ return T{std::forward<decltype(x)>(x) ... }; };
return std::apply(get_T, std::forward<tuple_t>(tuple));
}
semua kasus di atas akan berhasil, dengan cara yang mungkin dianggap lebih alami:
auto arr = curly_make_from_tuple<std::array<int, 2>>(std::make_tuple(9, 8)); // {9, 8}
auto vec = curly_make_from_tuple<std::vector<int>>(std::make_tuple()); // {}
auto vec2 = curly_make_from_tuple<std::vector<int>>(std::make_tuple(2, 3)); // {2, 3}
Pertanyaannya adalah: mengapa standar memilih inisialisasi tanda kurung bulat dibandingkan tanda kurung kurawal?
Tautan terkait:
Pertanyaan serupa, dari sudut pandang efisiensi: Mengapa apakah implementasi make_tuple tidak kembali melalui inisialisasi kurung kurawal?
Makalah asli yang mengusulkan make_from_tuple
, P0209r2, sepertinya tidak membahas dua alternatif T(params...)
dan T{params...}
, mungkin karena semua metode utilitas make_
serupa telah menggunakan inisialisasi tanda kurung bulat.
T(std::forward<decltype(x)>(x) ... )
bukannyaT{std::forward<decltype(x)>(x) ... }
? - person NathanOliver   schedule 26.05.2020std::make_unique
,std::make_shared
,std::make_tuple
, dll. jangan menginisialisasi sesuatu, mereka mengembalikan objek dan kelebihannya adalah keamanan thread, kesederhanaan, dll. - person asmmo   schedule 26.05.2020