Mam pewne problemy ze zrozumieniem warunków, w których C++ będzie używać niejawnej konwersji. Załóżmy, że mam klasę:Konwersje niejawne C++ w operandach dla standardowych operatorów
class SomeClass
{
private:
int val;
public:
SomeClass(int i) :val{ i } {}
operator string() { return to_string(val); }
};
Dlaczego podczas używania tej klasy z operatorami muszę rzutować na ciąg? Dlaczego po prostu nie wykonuje on konwersji domyślnie? Kod
:
int main(void)
{
SomeClass sc = 4;
cout << (string)sc << endl; //prints 4, compiles fine
cout << sc << endl;//does not compile, no operator "<<" matches these operands
string str1 = sc;//compiles fine, performs cast
string str2 = "Base String" + sc;//does not compile, no operator "+" matches these operands
}
To pytanie jest bardziej akademicki niż praktyczny, jak tylko za pomocą obsady jest bardziej czytelny w każdym razie.
Zatem, aby być bardziej zgodnym ze standardowymi funkcjami biblioteki C++ (bez rzutowania), powinienem pisać niejawne konwersje na 'basic_string', a nie na string? –
@ApoorvaKharche Nie, 'string' jest typedef dla jednej konkretnej instancji' basic_string'. To, czy 'operator <<' jest napisany w terminach 'basic_string' lub w terminach 'string' nie ma znaczenia, ponieważ oznaczają dokładnie to samo. Określa, czy 'operator <<' jest zapisany w terminach 'basic_string ' lub 'basic_string ', gdzie 'T' ma być wyprowadzone, robi różnicę i nie masz nad tym kontroli nad własnymi klasami. –
hvd