为什么我不能对提取运算符执行 decltype

Why Can't I do decltype on an Extraction Operator

看来这应该是合法的:

decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;

但是当我尝试编译时我得到:

error C2661: std::basic_istream<char,std::char_traits<char>>::operator >>: no overloaded function takes 2 arguments

我做错了什么吗?为什么这不计算为 istream

编辑:

因为 istream& istream::operator>>(int&) 是一个方法,所以第一个值是自动传递的。

但是:decltype(declval<istream>().operator>>(declval<int>())) test; 错误:

error C2664: std::basic_istream<char,std::char_traits<char>> &std::basic_istream<char,std::char_traits<char>>::operator >>(std::basic_streambuf<char,std::char_traits<char>> *): cannot convert argument 1 from std::ios_base::iostate to std::basic_istream<char,std::char_traits<char>> &(__cdecl *)(std::basic_istream<char,std::char_traits<char>> &)

decltype(istream::operator >> (declval<istream>(), declval<int>())) test; 错误:

error C2661: std::basic_istream<char,std::char_traits<char>>::operator >>: no overloaded function takes 2 arguments

接受 intoperator>> 是一个成员函数(您当前正在使用成员 非成员函数的语法)并且它通过引用获取它的参数(以便它可以填充它 - declval<int>() 给你一个 int&&,你需要 declval<int&>() 得到一个 int&):

using T = decltype(declval<istream>().operator>>(declval<int&>()));

最好不要直接调用运算符,这样您就不必担心哪个 operator<< 是成员,哪个不是:

using T = decltype(declval<istream&>() >> declval<int&>());