繁体   English   中英

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

[英]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::iostatestd::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个参数

接受intoperator>>是一个成员函数(你当前正在使用成员非成员函数的语法)并且它通过引用获取它的参数(这样它就可以填充它 - 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM