看来这应该合法:

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&>());

09-25 11:02