看起来这应该是合法的:
decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;
但是当我尝试编译时,我得到:
错误C2661:
std::basic_istream<char,std::char_traits<char>>::operator >>
:没有重载函数需要2个参数
我做错了吗?为什么不评估为istream
?
修改
has been pointed因为istream& istream::operator>>(int&)
是一种方法,所以第一个值会自动传递。
但是:decltype(declval<istream>().operator>>(declval<int>())) test;
错误:
错误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>> *)
:无法将参数1从std::ios_base::iostate
转换为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;
错误:
错误C2661:
std::basic_istream<char,std::char_traits<char>>::operator >>
:没有重载函数需要2个参数
答案 0 :(得分:7)
operator>>
int
是一个成员函数(您目前正在使用成员和非成员函数的语法)并且它接受了它的参数通过引用(以便它可以填充它 - declval<int>()
为您提供int&&
,您需要declval<int&>()
才能获得int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
更好的做法是不直接调用运算符,因此您不必担心哪个operator<<
是成员,哪个不是:
using T = decltype(declval<istream&>() >> declval<int&>());