为什么我不能在提取运算符上进行decltype

时间:2017-01-17 12:51:42

标签: c++ c++11 compile-time decltype extraction-operator

看起来这应该是合法的:

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个参数

1 个答案:

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