为什么我不能对提取运算符执行 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
接受 int
的 operator>>
是一个成员函数(您当前正在使用成员 和 非成员函数的语法)并且它通过引用获取它的参数(以便它可以填充它 - declval<int>()
给你一个 int&&
,你需要 declval<int&>()
得到一个 int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
最好不要直接调用运算符,这样您就不必担心哪个 operator<<
是成员,哪个不是:
using T = decltype(declval<istream&>() >> declval<int&>());
看来这应该是合法的:
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 fromstd::ios_base::iostate
tostd::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
接受 int
的 operator>>
是一个成员函数(您当前正在使用成员 和 非成员函数的语法)并且它通过引用获取它的参数(以便它可以填充它 - declval<int>()
给你一个 int&&
,你需要 declval<int&>()
得到一个 int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
最好不要直接调用运算符,这样您就不必担心哪个 operator<<
是成员,哪个不是:
using T = decltype(declval<istream&>() >> declval<int&>());