2014-01-17 55 views
1

假设我想要operator>>istream中提取整行而不是空白分隔的单词。我很惊讶地看到,这虽然可怕,实际工作:为什么我可以重载istream的操作符>>用于字符串?

#include <iostream> 
#include <string> 

namespace std { 
    istream &operator>>(istream &is, string &str) { 
    getline(is, str); 
    } 
} 

int main() { 
    std::string line; 
    std::cin >> line; 
    std::cout << "Read: '" << line << "'\n"; 
} 

如果键入多个单词到标准输入,它实际上叫我的操作和阅读一整行。

我期望operator>>的定义与official one相冲突,产生链接错误。为什么不呢?


编辑:我想,也许真正的operator>>是一个模板,非模板功能优先,但是这仍然作品一样好:

namespace std { 
    template<typename charT> 
    basic_istream<charT> &operator>>(basic_istream<charT> &is, basic_string<charT> &s) { 
    getline(is, s); 
    } 
} 
+1

[签名不看完全一样(http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt)。 P.S:[不要使用cplusplus.com](http://kera.name/articles/2013/02/cplusplus-com-is-bad-and-you-should-feel-bad/) – Borgleader

回答

3

发生,因为工作官方模板is less specific(还有其他模板参数)。

然而,它是Undefined Behaviour™。您只能为自己的类型提供标准库符号的重载。如果你遇到另一个标准库,它会定义额外的重载(可能),它会停止工作,你不知道为什么。

相关问题