简单的例子。此代码无法编译:
#include <iostream>
#include <iterator>
using test_t = std::pair<int, int>;
std::istream& operator>>(std::istream& in, test_t& t) {
return in >> t.first >> t.second;
}
int main() {
auto it = std::istream_iterator<test_t>(std::cin);
}
编译日志包含一堆替换错误并以
/usr/include/c++/8.2.1/bits/stream_iterator.h:121:17: error: no match for 'operator>>' (operand types are 'std::istream_iterator<std::pair<int, int> >::istream_type' {aka 'std::basic_istream<char>'} and 'std::pair<int, int>')
*_M_stream >> _M_value;
但是,如果我将 test_t 更改为这样的结构:
#include <iostream>
#include <iterator>
struct test_t {
int first;
int second;
};
std::istream& operator>>(std::istream& in, test_t& t) {
return in >> t.first >> t.second;
}
int main() {
auto it = std::istream_iterator<test_t>(std::cin);
}
它编译得很好。或者,如果我保留 std::pair,但直接从 std::cin 调用 operator>>,它也可以正常工作:
#include <iostream>
#include <iterator>
using test_t = std::pair<int, int>;
std::istream& operator>>(std::istream& in, test_t& t) {
return in >> t.first >> t.second;
}
int main() {
test_t t;
std::cin >> t;
}
有谁知道为什么会这样?或者它只是编译器中的一个错误或什么?
顺便说一句,编译器是 g++ (GCC) 8.2.1