c++ - Implicit type conversion is not working -


class test { public:     operator string() {         return string{"test!"};     } };  int main() {     cout << test{}; } 

i expecting test object implicit converted string , output, gives me error:

error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue 'std::basic_ostream<char>&&' 

this explicit conversion works:

cout << string{test{}}; 

i got working casting const char*:

class test { public:     operator const char*() {         return "test!";     } }; 

then output:

cout << test{}; //yay works. 

i assuming cout << string implicit conversion string char * , if use casting string, not perform 2 level conversion test string char *. after directly casting const char*, works. (please correct if assumption wrong)


to prove assumption right

class test { public:     operator string() {         return string{"test!"};     } };  ostream& operator<< (ostream& os, string s){     os << s;     return os; } 

this perform direct type deduction test string , output string. , after tried, works!

cout << test{}; //yay works! output "test!" 

something special cout << string explained borgleader. assumption partially correct , partially wrong.

the explicit keyword means have explicitly conversion std::string(test{}). disables implicit conversions.

cout << string{test{}}; // <-- explicit, you've got implicit , explicit confused 

the rule is, during template argument deduction, no user defined conversion attemped. however, you've noted if have conversion operator int compiles. because overload not function template. take @ reference page, , see:

basic_ostream& operator<<( int value ); 

this non-templated overload compiler user defined conversions.


Comments

Popular posts from this blog

css - Which browser returns the correct result for getBoundingClientRect of an SVG element? -

gcc - Calling fftR4() in c from assembly -

.htaccess - Matching full URL in RewriteCond -