EDIT: Saya mencoba beberapa, dan menemukan sesuatu yang sedikit lebih halus dari yang saya kira. Inilah yang sekarang saya pikirkan adalah jawaban yang akurat.
&s
bukan lvalue sehingga Anda tidak dapat membuat referensi untuk itu kecuali jika jenis rujukannya adalah const
. Jadi misalnya, Anda tidak dapat melakukannya
string * &r = &s;
tapi kamu bisa melakukannya
string * const &r = &s;
Jika Anda meletakkan deklarasi serupa di header fungsi, itu akan berfungsi.
void myfunc(string * const &a) { ... }
Ada masalah lain, yaitu, sementara. Aturannya adalah Anda hanya bisa mendapatkan referensi sementara jika itu const
. Jadi dalam hal ini orang mungkin berpendapat bahwa & s bersifat sementara, dan karenanya harus dinyatakan const
dalam prototipe fungsi. Dari sudut pandang praktis, tidak ada bedanya dalam kasus ini. (Ini baik nilai atau sementara. Either way, aturan yang sama berlaku.) Namun, secara tegas, saya pikir itu bukan sementara tapi nilai. Saya bertanya-tanya apakah ada cara untuk membedakan keduanya. (Mungkin hanya didefinisikan bahwa semua temporari adalah nilai, dan semua bukan-nilai adalah temporal. Saya bukan ahli dalam standar.)
Yang sedang berkata, masalah Anda mungkin pada tingkat yang lebih tinggi. Mengapa Anda ingin referensi ke alamat s
? Jika Anda ingin referensi ke pointer s
, Anda perlu mendefinisikan pointer seperti di
string *p = &s;
myfunc(p);
Jika Anda ingin referensi s
atau penunjuk s
, lakukan hal langsung.
string* const& val
alih - alih persamaan yang kurang dapat dibaca seperti misalnyaconst string* &val
. Untuk mata saya ini jelas merupakan referensi const , ke pointer, ke string. Saya pribadi lebih suka menulisT const&
daripadaconst T&
dalam deklarasi untuk mendapatkan klarifikasi yang tepat ini.