Dalam C ++, operator ::
digunakan untuk mengakses kelas, fungsi dan variabel dalam namespace atau kelas.
Jika spesifikasi bahasa yang digunakan .
sebagai pengganti ::
dalam kasus-kasus tersebut juga seperti ketika mengakses variabel instan / metode dari suatu objek, apakah itu akan menyebabkan kemungkinan ambiguitas yang tidak ada ::
?
Mengingat bahwa C ++ tidak mengizinkan nama variabel yang juga merupakan nama jenis, saya tidak bisa memikirkan kasus di mana itu bisa terjadi.
Klarifikasi: Saya tidak bertanya mengapa ::
dipilih .
, hanya jika itu bisa bekerja juga?
c++
language-design
Jimmy RT
sumber
sumber
Jawaban:
Karena upaya untuk membuat C ++ sebagian besar kompatibel dengan kode C yang ada (yang memungkinkan collision nama antara nama objek dan tag struct), C ++ memungkinkan collision nama antara nama kelas dan nama objek.
Yang berarti:
adalah kode yang sah.
sumber
.
atau di::
antara dua "kata" yang sama memiliki efek yang berbeda (data.member
merujukmember
padadata
objek kelasdata2
, sedangkandata::member
mengacumember
pada kelasdata
)?::
diubah.
. Di satu sisi Anda sudah menjawab ya . Saya tidak bisa menerobos komentar pertama Anda. Mungkin level saya membuat komentar itu terlihat berasap bagi saya.Contoh di mana keduanya valid, tetapi merujuk ke objek yang berbeda:
Lihat langsung di coliru .
sumber
Ada perbedaan di antara keduanya
a::b
dan dia.b
mana::
menyiratkan yanga
digunakan sebagai namespace, yang berarti bahwa itu adalah namespace atau nama ketik. Asalkan C ++ mendukung pewarisan jamak non-virtual dan bahwa suatu variabel dapat memiliki nama yang sama dengan tipe, ini menghilangkan peluang referensi objek yang salah. Ini diperlukan untuk metaprogramming template.Contoh lain adalah
&B::foo
vs&B.foo
dalam konteks kelas B.sumber
Biarkan memperpanjang contoh @Deduplicator:
Langsung di Coliru Viewer
Tidak memiliki kemungkinan untuk membedakan dengan bantuan ::, anggota mana yang ingin kita akses, tidak mungkin untuk mengakses anggota yang dinyatakan dalam kelas induk dengan nama yang identik.
sumber
A A
(nama variabel yang juga merupakan nama jenis) tidak valid dalam C ++, jadi contoh ini tidak berfungsi untuk saat ini