【发布时间】:2017-01-17 12:51:41
【问题描述】:
看来这应该是合法的:
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 个参数
【问题讨论】:
-
istream的成员oparator<<不会将istream作为第一个参数。 -
为什么不直接使用
decltype(std::declval<std::ifstream &>() >> std::declval<int>())?这甚至适用于operator >>...的非成员重载... -
istream& istream::operator<<(const int&)不是一个东西,原因很明显。 -
@JonathanMee 我的意思是this。当然,这不能解决所有可能的问题,但是当您不确定某事的类型时,它显然可以解决问题。
-
@JonathanMee 确定你想要 :) 但你可以在运行时检查类型以在编译时应用知识:)
标签: c++ c++11 compile-time decltype extraction-operator