Rangkaian C ++; string + ganda; operator + vs operator + =

Sep 07 2020

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

7 SebastianRedl Sep 07 2020 at 15:32

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.