2014-09-17 3 views
1

В следующем примере, почему operator << предпочитают использовать для двойного, а не для строки? Это потому, что примитив имеет более высокий приоритет?C++: оператор << неявный приоритет литья

class R { 
public: 
    R(double x) : _x(x) {} 
    operator string() {cout << "In string operator\n"; return std::to_string(_x);} 
    operator double() {cout << "In double operator\n"; return _x;} 
private: 
    double _x; 
}; 

int main() { 
    R r(2.5); 
    cout << r << endl; 
    return 0; 
} 

ответ

0

Это потому, что operator std::string() просто нежизнеспособно. Перегрузка operator<< с basic_string сек является

template<class charT, class traits, class Allocator> 
basic_ostream<charT, traits>& 
operator<<(basic_ostream<charT, traits>& os, const basic_string<charT,traits,Allocator>& str); 

И аргумент шаблона вычет не может вывести аргументы шаблона из типа R. Он не будет рассматривать неявные преобразования.

Вы можете это увидеть, комментируя operator double и watching your code explode.

Смежные вопросы