假设我希望operator>>
从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";
}
如果我在stdin中键入多个单词,它实际上会调用我的运算符并读取整行。
我希望operator>>
的此定义与official one冲突,从而产生链接错误。为什么不呢?
编辑:我想也许真正的operator>>
是一个模板,非模板函数优先,但这仍然有效:
namespace std {
template<typename charT>
basic_istream<charT> &operator>>(basic_istream<charT> &is, basic_string<charT> &s) {
getline(is, s);
}
}
答案 0 :(得分:3)
发生工作,因为官方模板is less specific(还有其他模板参数)。
但它是Undefined Behaviour™。您只能为自己的类型提供标准库符号的重载。如果您遇到另一个标准库,它将定义额外的重载(它可能),它将停止工作,您不会知道原因。