Pertimbangkan kode ini:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
Ini mencetak:
vector overload
int overload
Mengapa ini tidak menghasilkan kesalahan kompilasi karena resolusi kelebihan yang ambigu? Jika konstruktor kedua dihapus, kami mendapatkan vector overload
dua kali. Bagaimana / dengan metrik manakah int
kecocokan yang pasti lebih baik {}
daripada std::vector<int>
?
Tanda tangan konstruktor pasti dapat dipangkas lebih lanjut, tapi saya baru saja diakali oleh sepotong kode yang setara dan ingin memastikan tidak ada yang penting yang hilang untuk pertanyaan ini.
{}
efektif dalam kasus-kasus khusus tertentu, tetapi umumnya tidak benar (untuk permulaan, std::vector<int> x = {};
bekerja, std::vector <int> x = 0;
tidak). Ini tidak sesederhana " {}
menetapkan nol".
struct A { int x = 5; }; A a = {};
tidak menetapkan nol dalam arti apa pun, itu membangun sebuah A
dengan a.x = 5
. Ini tidak seperti A a = { 0 };
, yang menginisialisasi a.x
ke 0. Nol tidak melekat pada {}
, itu melekat pada bagaimana setiap jenis dibangun secara default atau nilai-diinisialisasi. Lihat di sini , di sini dan di sini .
{}
sebagai blok kode, berikan 0 ke variabel - contoh: const char x = {}; diatur ke 0 (null char), sama untuk int dll.