C ++ birleştirme; dize + çift; operatör + operatör + =

Sep 07 2020

gcc v10.2.0, -std = c ++ 11

Çift değeri 'std :: to_string ()' kullanarak değişmez bir dizeye dönüştürmeye çalışmıyorum. Bir dizeye bir tamsayı eklemenin benzer bir etkisini elde etmeye çalışıyorum, ancak bunun yerine çift değerle.

Beklenen çıktı: "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;

'String' sınıfının 'operatör +' ve 'operatör + =' yöntemlerinin her ikisi de bir 'char' bağımsız değişkenini kabul eden bir sürüme sahiptir, ancak yalnızca 'operatör + =' yöntemi örtük olarak dönüştürülmüş bir değer alıyor gibi görünüyor ve bir hata üretmiyor.

Derleyici neden dönüştürülmüş bir değeri diğerine geçirmeyi seçiyor?

Yanıtlar

7 SebastianRedl Sep 07 2020 at 15:32

operator +=bir üye işlevdir ve kendi başına bir şablon değildir. Yani belirli bir stringörnek için, RHS argümanı char. Derleyici bu türe bir dönüşüm arayacaktır.

operator +herhangi bir basic_stringörnekleme ile çalışması için şablon haline getirilmiş ücretsiz bir işlev şablonu :

template<class CharT, class Traits, class Alloc>
std::basic_string<CharT,Traits,Alloc>
    operator+( const std::basic_string<CharT,Traits,Alloc>& lhs,
               CharT rhs );

Bunun CharThem basic_stringargümanda hem de RHS olarak kullanıldığına dikkat edin. Bu, derleyicinin onu her iki argümandan çıkarmaya çalışacağı ve tutarlı bir sonuca ulaşması gerektiği anlamına gelir. Ama ek olarak, sol taraf bir olduğunu string, yapım CharTbir char, ama sağ taraf bir olduğunu doubleyapma, CharTbir double. Bu tutarsızlık, derleyicinin bir tür CharTseçememesinin ve dolayısıyla aşırı yüklemeyi tamamen ortadan kaldırmasının nedenidir . Sonra, tüm aşırı yüklemelere bakıldığında operator +, vazgeçer ve eşleşen bir işlev olmadığını söyler.