看来这应该合法:
decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;
但是当我尝试编译时,我得到:
难道我做错了什么?为什么这不等于
istream
?编辑:
has been pointed指出,因为
istream& istream::operator>>(int&)
是一种方法,所以第一个值是自动传递的。但是:
decltype(declval<istream>().operator>>(declval<int>())) test;
错误:和
decltype(istream::operator >> (declval<istream>(), declval<int>())) test;
错误与:最佳答案
接受operator>>
的int
是成员函数(您当前正在使用成员和非成员函数的语法),并且通过引用接受其参数(以便可以填充它)-declval<int>()
提供了int&&
,您需要declval<int&>()
可以得到一个int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
更好的是不要直接调用该运算符,因此您不必担心哪个
operator<<
是成员而哪个不是:using T = decltype(declval<istream&>() >> declval<int&>());