[英]Why Can't I do decltype on an Extraction Operator
看来这应该是合法的:
decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;
但是当我尝试编译时,我得到:
错误C2661:
std::basic_istream<char,std::char_traits<char>>::operator >>
:没有重载函数需要2个参数
难道我做错了什么? 为什么这不评估为istream
?
编辑:
有人指出 ,因为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个参数
接受int
的operator>>
是一个成员函数(你当前正在使用成员和非成员函数的语法)并且它通过引用获取它的参数(这样它就可以填充它 - declval<int>()
给你一个int&&
,你需要使用declval<int&>()
来得到一个int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
更好的方法是不直接调用运算符,因此您不必担心哪个operator<<
是成员而哪些不是:
using T = decltype(declval<istream&>() >> declval<int&>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.