Rangkaian C ++; string + ganda; operator + vs operator + =
gcc v10.2.0, -std = c ++ 11
Saya tidak mencoba mengonversi nilai ganda menjadi string literal menggunakan 'std :: to_string ()'. Mencoba untuk mendapatkan efek serupa dengan menambahkan bilangan bulat ke string tetapi dengan nilai ganda sebagai gantinya.
Keluaran yang diharapkan: "abcdA"
string s { "abcd" };
double d { 65.1 };
// s = s + d; // Error. no match for ‘operator+’ (operand types are ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} and ‘double’)
s += d;
Baik metode 'operator +' dan 'operator + =' dari kelas 'string' memiliki versi yang menerima argumen 'char' tetapi hanya metode 'operator + =' yang tampaknya menerima nilai yang dikonversi secara implisit dan tidak menghasilkan kesalahan.
Mengapa kompilator memilih untuk meneruskan nilai yang dikonversi ke satu nilai di atas yang lain.
Jawaban
operator +=adalah fungsi anggota, dan bukan template itu sendiri. Jadi untuk stringcontoh tertentu , argumen RHS-nya adalah char. Kompilator akan mencari konversi ke tipe ini.
operator +adalah template fungsi gratis, dengan template sehingga berfungsi dengan basic_stringinstance apa pun :
template<class CharT, class Traits, class Alloc>
std::basic_string<CharT,Traits,Alloc>
operator+( const std::basic_string<CharT,Traits,Alloc>& lhs,
CharT rhs );
Perhatikan bahwa CharTdigunakan baik dalam basic_stringargumen dan sebagai RHS. Ini berarti kompilator akan mencoba menyimpulkannya dari kedua argumen, dan perlu sampai pada hasil yang konsisten. Tetapi sebagai tambahan Anda, sisi kiri adalah a string, membuat CharTa char, tetapi sisi kanan adalah a double, membuat CharTa double. Ketidakkonsistenan inilah yang menyebabkan compiler tidak dapat memilih jenis untuk CharTdan karenanya menutup kelebihan beban sepenuhnya. Kemudian, ketika selesai melihat semua kelebihan beban operator +, itu menyerah dan mengatakan bahwa tidak ada fungsi yang cocok.