Pertimbangkan kode berikut.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 tidak mengkompilasi itu. Itu angka ada panggilan ambigu yang berlebihan, seperti 1-1
yang sama 0
dan karena itu dapat dikonversi menjadi double*
. Trik lain, seperti 0x0
, 0L
, atau static_cast<int>(0)
, tidak bekerja baik. Bahkan mendeklarasikan const int Zero = 0
dan menelepon f(Zero)
menghasilkan kesalahan yang sama. Ini hanya berfungsi dengan baik jika Zero
tidak const
.
Sepertinya masalah yang sama berlaku untuk GCC 5 dan di bawah, tetapi bukan GCC 6. Saya ingin tahu apakah ini adalah bagian dari standar C ++, bug MSVC yang diketahui, atau pengaturan dalam kompiler. Google sepintas tidak membuahkan hasil.
sumber
1-1
sebuah literal bilangan bulat ? Ini adalah ekspresi yang mengandung dua literal bilangan bulat dengan nilai1
dan-
operator.-1
). Yang mana, karena jenis default ditandatangani , bagaimanapun, jelas diperlukan, dan itu terbukti mungkin (dan diterima secara universal) juga.1-1
. C ++ tidak memiliki literal bilangan bulat negatif.-1
adalah ekspresi yang terdiri dari1
integer literal (dari tipe bertanda tangan) dan-
operator minus unary. Lihat juga bagian "Catatan" di cppreference.com .u
, literal Anda, per definisi, ditandatangani. Jenis yang ditandatangani memiliki nilai negatif (sekitar 50% dari nilai yang mungkin negatif). Sangat disayangkan bahwa tata bahasa (untuk alasan yang saya tidak akan tahu) menyesatkan dengan cara ini, dan meskipun secara teknis (menurut tata bahasa) -1 adalah literal positif, dinegasikan, dengan segala cara lain tentu saja negatif harfiah. Sama seperti 3 + 4 adalah literal.0U
. Masalah yang sama. Apa yang saya tidak coba adalah sebuahenum
nilai. Mungkin yang bernama akan mengubah banyak hal. Saya akhirnya menulis ekspresi panjang dengandecltype
danremove_reference
.