Pertanyaan Apakah konstruktor default dari std :: pair <> mengatur tipe dasar (int, dll) ke nol?


Setelah menulis:

std::pair<int, int> x;

Apakah saya menjamin bahwa x.first dan x.second adalah nol? Atau bisakah mereka memiliki nilai?

Alasan mengapa saya peduli adalah karena saya mencoba menentukan apakah peta yang nilainya adalah pointer dijamin akan mengembalikan NULL jika saya mengakses elemen yang tidak ada di peta. Ya, jika saya melakukannya:

std::map<int, void*> my_map;
std::cout << int(my_map[5]) << std::endl;

maka saya dijamin mendapat nol (NULL)? Ataukah perilaku tidak terdefinisi?


32
2018-01-26 21:41


asal


Jawaban:


Ya, jaminan itu berlaku. Mengutip standar C ++ 11, §20.3.2 / 2-3:

constexpr pair();

2 Membutuhkan:  is_default_constructible<first_type>::value aku s true dan is_default_constructible<second_type>::value aku s true.
  3 Efek: Inisialisasi nilai first dan second.

Dan §8.5 / 7:

Untuk nilai-inisialisasi sebuah objek tipe T cara:

  • jika T adalah tipe kelas (mungkin cv-qualified) dengan konstruktor yang disediakan pengguna, maka konstruktor default untuk T disebut (dan inisialisasi tidak terbentuk jika T tidak memiliki konstruktor bawaan yang dapat diakses);
  • jika T adalah tipe kelas non-union (mungkin cv-qualified) tanpa konstruktor yang disediakan pengguna, maka objeknya adalah nol-diinisialisasi dan, jika TKonstruktor default implisit-menyatakan adalah non-sepele, konstruktor yang disebut.
  • jika T adalah tipe larik, lalu setiap elemen diinisialisasi nilai;
  • jika tidak, objek tersebut diinisialisasi nol.

Dan terakhir, §8.5 / 5:

Untuk nol-menginisialisasi sebuah objek atau referensi tipe T cara:

  • jika T adalah tipe skalar, objek diatur ke nilai 0 (nol), diambil sebagai ekspresi konstanta integral, dikonversi menjadi T;
  • jika T adalah tipe kelas non-union (mungkin cv-qualified), setiap anggota data non-statis dan setiap subobjek kelas dasar adalah nol-diinisialisasi dan padding diinisialisasi ke nol bit;
  • jika T adalah jenis union (mungkin cv-qualified), nama data non-statis pertama objek adalah nol-diinisialisasi dan padding diinisialisasi ke nol bit;
  • jika T adalah tipe array, setiap elemen adalah nol-diinisialisasi;
  • jika T adalah tipe referensi, tidak ada inisialisasi yang dilakukan.

29
2018-01-26 21:56



Dari standar C ++ 11, bagian § 20.3.2

constexpr pair();
...
Effects: Value-initializes first and second.

Jadi itu didefinisikan dengan baik bahwa inisialisasi default dari suatu std::pair<int, int> objek akan menghasilkan kedua anggota yang diatur ke 0.


5
2018-01-26 21:55



Ya, mereka nol-diinisialisasi. Kutipan dari Bjarne Stroustrup's "The C ++ Programming Language" (edisi ke-3, Bab 17.4.1.7):

Hasil dari m[k] setara dengan hasil dari (*(m.insert(make_pair(k,V())).first)).second, dimana V() adalah nilai default dari tipe yang dipetakan. Ketika Anda memahami kesetaraan itu, Anda mungkin memahami wadah asosiatif.

Untuk kutipan standar apa yang diinisialisasi bawaan berarti melihat jawaban orang lain.


4
2018-01-26 22:02



Ya, pasangan akan memanggil konstruktor default.


2
2018-01-26 21:50