Кажется, это должно быть законно:
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::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 аргумента
operator>>
это занимает int
является функцией-членом (в настоящее время вы используете синтаксис для обоих членов а также функции, не являющиеся членами), и он принимает аргумент по ссылке (чтобы он мог заполнить его — declval<int>()
дает вам int&&
, тебе нужно declval<int&>()
чтобы получить int&
):
using T = decltype(declval<istream>().operator>>(declval<int&>()));
Еще лучше не вызывать оператора напрямую, поэтому вам не нужно беспокоиться о том, какой operator<<
является членом и который не является:
using T = decltype(declval<istream&>() >> declval<int&>());
Других решений пока нет …