Soru harita operatörü [] ve değer olarak bool


Var olmayan bir anahtara erişmeye çalışırsak biliyoruz. std::map [] ile operatör, bu tuşla yeni bir eleman ekleyecektir.

Sahibiz: std::map<std::string, bool> map_xxx;

Varolmayan anahtarına eriştikten sonra map_xxx["nonexistent_key"]İkinci argümanın değeri her zaman false ?

ps. hayırsa, bu davranışa nasıl sahip olacaksınız?


21
2018-06-15 21:28


Menşei


Bence senin sorunun gerçekten: "Değeri nedir?" bool()? ", gösterilen koddan anlaşıldığı üzere bu sayfa. - chris
olası kopyası Std :: pair <> varsayılan yapıcısı, temel türleri (int, etc) sıfırlar mı? - ildjarn


Cevaplar:


Evet. Eklenecek olan değerin false.


C ++ 98'de, mekanizmaya sınıflar için sıfır başlatma olarak belirtilen varsayılan başlatma denir; işte false Booleanlar için.

C ++ 03'ten beri, mekanizmaya, sınıflar için hala sıfır başlatma olarak belirtilen değer başlatma denir; ve böylece hala false Booleanlar için. Örneğin, C ++ 14'ün bu konuda söyleyeceklerini görelim.

§23.4.4.3'ten; sadece yerine bool kale".

T& operatörü [] (const key_type & x);

  1. Efektler: Haritada x'e eşdeğer bir anahtar yoksa, value_type (x, T ()) haritaya.
  2. Gerektirir: key_type CopyInsertable olmalı ve mapped_type DefaultInsertable olmalıdır   *bu.

§8.5'ten itibaren, paragrafları aşağıdan yukarıya doğru sindirmek:

Bir nesneyi sıfırlamak için veya T türünün başvurusu şu anlama gelir:

- T bir skaler tip (3.9) ise, nesne tarafından elde edilen değere başlatılır. dönüştürme tamsayı değişmez 0 (sıfır) T'ye;

...

için değer initialize T tipi bir nesne şu anlama gelir:

- T, varsayılan yapıcı (12.1) veya kullanıcı tarafından sağlanan veya silinmiş varsayılan kurucu ile bir (muhtemelen cv-kalifiye) sınıf tipi (Madde 9) ise, nesne varsayılan olarak başlatılır;

- T, kullanıcı tarafından sağlanan veya silinen varsayılan kurucu olmayan bir (muhtemelen cv-kalifiye) sınıf tipiyse, nesne sıfır başlatılır ve varsayılan başlatma için semantik kısıtlamalar kontrol edilir ve T'nin önemsiz olmayan bir varsayılan değeri varsa kurucu, nesne varsayılan başlatılır;

- T bir dizi tipi ise, o zaman her elemanın değeri başlatılır;

- aksi halde, nesne sıfır başlatıldı.

...

Başlatıcı boş bir parantez takımı olan bir nesne, yani, (), olmalı değer başlatıldı.

§4.12'den itibaren:

Aritmetik, işaretsiz numaralandırma, işaretçi veya üye türüne göre bir işaretçi, bir tür boole değerine dönüştürülebilir. bir sıfır değer, boş gösterici değeri veya null üye işaretçisi değeri false dönüştürülür; diğer herhangi bir değer true değerine dönüştürülür. Doğrudan başlatma (8,5) için, std :: nullptr_t türünde bir değer, bir tür boole değerine dönüştürülebilir; Ortaya çıkan değer yanlıştır.


29
2018-06-15 21:30