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 overloaddua kali. Bagaimana / dengan metrik manakah intkecocokan 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 Adengan a.x = 5. Ini tidak seperti A a = { 0 };, yang menginisialisasi a.xke 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.